Pythonの技法:ZIPアーカイブへの書き込みと追記

文:Nick Gibson(Builder AU)  翻訳校正:原井彰弘
2008-01-08 14:00:00
  • このエントリーをはてなブックマークに追加

 以下のような内容のファイル「file3.txt」があると仮定しよう。

File Three Contents

1234567890

 このファイルを先ほど作成したzipファイル(test2.zip)に追加するには、以下のコードを記述すればよい。

>>> import zipfile
>>> z = zipfile.ZipFile("test2.zip", "a")
>>> z.printdir()
File Name                                             Modified             Size
file1.txt                                      2007-10-11 14:03:12           54
file2.txt                                      2007-10-11 14:03:32           37
>>> z.write("file3.txt")
>>> z.printdir()
File Name                                             Modified             Size
file1.txt                                      2007-10-11 14:03:12           54
file2.txt                                      2007-10-11 14:03:32           37
file3.txt                                      2007-10-16 14:25:46           32
>>> z.close()

 最後に、わずか数行でzipファイルをディスク上に展開するプログラムが書けることをお見せしよう。以下のPythonプログラムは、引数として渡されたzipファイルすべてを、カレントディレクトリ上に展開するものだ。

from zipfile import *
import sys

for zipname in sys.argv[1:]:
z = ZipFile(zipname)
for filename in z.namelist():
outfile = file(filename, "w")
outfile.write(z.read(filename))
outfile.close()

 このプログラムは以下のように動作する。

$ ls
test2.zip  unzip.py
$ python unzip.py test2.zip 
$ ls
file1.txt  file2.txt  file3.txt  test2.zip  unzip.py
$ cat file1.txt 
File One Contents

"Testing, testing, one two three."

 注意していただきたいのは、このプログラムは単純であるため、フラットなファイル構造のzipアーカイブでしか動作しないということだ。つまり、ディレクトリが入れ子になっていてはいけないのである。もしそのような構造にも対応したければ、実行中に順次ディレクトリを作成するよう、プログラムを修正する必要がある。この機能の拡張は、あなたにお任せすることとしよう。

このサイトでは、利用状況の把握や広告配信などのために、Cookieなどを使用してアクセスデータを取得・利用しています。 これ以降ページを遷移した場合、Cookieなどの設定や使用に同意したことになります。
Cookieなどの設定や使用の詳細、オプトアウトについては詳細をご覧ください。
[ 閉じる ]