レッスン テキストの zipfile の例には、zipfile に保存されるファイルのフル パスが格納されています。ただし、通常、zip ファイルには相対パス名のみが含まれます (zip ファイルの作成後に名前がリストされると、「v:\」が削除されていることがわかります)。
このプロジェクトでは、ディレクトリ パスを受け取り、ディレクトリのみのアーカイブを作成する関数を記述します。たとえば、例と同じパス (「v:\workspace\Archives\src\archive_me」) を使用した場合、zip ファイルには「archive_me\groucho」、「archive_me\harpo」および「archive_me\chico」が含まれます。zipfile.namelist() は、返されるものに常にスラッシュを使用することに注意してください。これは、観測されたものと期待されたものを比較するときに対応する必要があるという事実です。
ベース ディレクトリ (上記の例では「archive_me」) は入力の最後の要素であり、zip ファイルに記録されるすべてのパスはベース ディレクトリから開始する必要があります。
ディレクトリにサブディレクトリが含まれる場合、サブディレクトリ名とサブディレクトリ内のファイルは含めないでください。(ヒント: isfile() を使用して、ファイル名がディレクトリではなく通常のファイルを表しているかどうかを判別できます。)
私は以下のコードを持っています:
import os, shutil, zipfile, unittest
def my_archive(path):
x = os.path.basename(path)
zf = zipfile.ZipFile(x, "w")
filenames = glob.glob(os.path.join(x, "*"))
print(filenames)
for fn in filenames:
zf.write(fn)
zf.close
zf = zipfile.ZipFile(path)
lst = zf.namelist()
return(lst)
zf.close()
import os, shutil, zipfile, unittest
import archive_dir
class TestArchiveDir(unittest.TestCase):
def setUp(self):
self.parentPath = r"/Users/Temp"
self.basedir = 'archive_me'
self.path = os.path.join(self.parentPath,self.basedir)
if not os.path.exists(self.path):
os.makedirs(self.path)
self.filenames = ["groucho", "harpo", "chico"]
for fn in self.filenames:
f = open(os.path.join(self.path, fn), "w")
f.close()
def test_archive_create(self):
observed = archive_dir.my_archive(self.path)
expected = ["archive_me/groucho", "archive_me/harpo", "archive_me/chico"]
self.assertEqual(set(expected), set(observed))
def tearDown(self):
try:
shutil.rmtree(self.parentPath, ignore_errors=True)
except IOError:
pass
if __name__=="__main__":
unittest.main()
「IOError: [Errno 21] Is a directory: 'archive_me'」というエラーが表示されます。これは、アーカイブを圧縮しようとしていることが原因であることはわかっていますが、これを修正する方法がわかりません。ファイルだけを圧縮してテストを通過するにはどうすればよいですか?
ありがとう