0

レッスン テキストの 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'」というエラーが表示されます。これは、アーカイブを圧縮しようとしていることが原因であることはわかっていますが、これを修正する方法がわかりません。ファイルだけを圧縮してテストを通過するにはどうすればよいですか?

ありがとう

4

2 に答える 2

0

質問のヒント (おそらく宿題に関連するもの) を参照し、表示されている IOError とどのように関連しているかを考えてください。

その他のヒント/ヒント:

  1. 一度にすべてを印刷するのではなく、処理中の情報を印刷してみてください。これにより、エラーを追跡し、ユーザーに進行状況を示すことができます。

  2. エラーが発生した場所を特定できるかどうかを確認し、ユーザーにより良いフィードバックを提供します。

  3. 各関数を 1 つのジョブとして考え、それが my_archive の実行内容とどのように関連しているかを確認します (テストと実際の使用の両方で)。

  4. 関数の名前は、その機能を説明するものにする必要があります。通常のパターンはverb_noun.

于 2013-03-09T21:36:54.203 に答える