Pythonモジュールのzipfileの原理と使い方の詳細


zipfileはpythonでzip形式のコードを圧縮して解凍するものです。一般的なzip形式ですので、このモジュールの使用頻度も高いです。
zipfileには二つの非常に重要なクラスがあります。それぞれZipFileとZipInfoです。ほとんどの場合、私たちはこの二つのクラスだけを使ってもいいです。
ZipFileは主要なクラスであり、zipファイルを作成して読み込むために使用されます。
ZipInfoは、zipファイルの各ファイルの情報を格納しています。
例えばzipfileを読み込むには、ここでfilenameがファイルのパスだと仮定します。

import zipfile
z = zipfile.ZipFile(filename, 'r') #          r     zip  ,w     zip  
for f in z.namelist():
  print f
上のコードはzip圧縮カバンの中の全てのファイルの名前を読み取ります。z.namelist()は圧縮パケット内のファイル名の一覧を返します。
次を見てください。

import zipfile
z = zipfile.ZipFile(filename, 'r')
for i in z.infolist():
  print i.file_size, i.header_offset
ここではz.infolist()を使用していますが、このバックパック内のすべてのファイルの情報を圧縮したものが、ZipInfoのリストです。一つのZopInfoオブジェクトには圧縮パッケージ内の一つのファイルの情報が含まれています。その中でよく使われているのはfilename、file_です。size,header_offsetは、それぞれファイル名、ファイルサイズ、圧縮パケット中のファイルデータのオフセットです。実は前のZ.namelist()は読み取ったZopInfoの中のfilenameで、リストを作って帰ってきました。
圧縮袋から一つのファイルを解凍する方法はZipFileのreadを使う方法です。

import zipfile
z = zipfile.ZipFile(filename, 'r')
print z.read(z.namelist()[0])
このようにして、Z.namelist()の最初のファイルを読み出して、スクリーンに出力します。もちろんファイルに保存してもいいです。
以下はzip圧縮パッケージを作成する方法です。
読み取りの方法と実際には似ています。

import zipfile, os

z = zipfile.ZipFile(filename, 'w') #            w,   filename       

#       testdir             (              ):
if os.path.isdir(testdir):
  for d in os.listdir(testdir):
    z.write(testdir+os.sep+d)
# close()       !
z.close()
上のコードはとても簡単です。
もう一つの問題があります。もし私が一つのtest/111.txtを圧縮カバンに追加したら、test 22/111.txtに入れたいです。どうすればいいですか?
実はこれがZipFileのwrite方法の中で二番目のパラメータの役割です。このような呼び出しが必要です。Z.write(「test/111.txt」、「test 22/111.txt」)
以上が本文の全部です。皆さんの勉強に役に立つように、私たちを応援してください。