PythonがZIPファイルの圧縮と解凍を実現する方法の分析

3633 ワード

この例では、PythonがZIPファイルの圧縮および解凍を実現する方法について説明します.皆さんの参考にしてください.具体的には以下の通りです.
Pythonでzipファイルを使用する必要がある場合がありますが、1.6版ではzipfileモジュールが提供されています.ただし、Pythonのzipfileモジュールではマルチボリュームを処理できない場合がありますが、この場合はあまり見られないため、通常は十分に使用できます.次は基本的なzipfile操作を記録しただけで、ほとんどの状況に対応するのに十分です.
zipfileモジュールでは、zipファイルを開くか書き込むことができます.例:

import zipfile
z = zipfile.ZipFile('zipfilename', mode='r')


これによりzipファイルが開き、modeが「w」または「a」の場合、zipファイルに書き込むことを示します.書き込みの場合は、3番目のパラメータに続くこともできます.
compression=zipfile.ZIP_DEFLATEDまたはcompression=zipfile.ZIP_STORED ZIP_DEFLATEDは圧縮フラグであり、zlibモジュールをコンパイルする必要がある場合に使用します.そして一つはzipでパッケージ化するだけで、圧縮しません.
zipファイルを開くと、必要に応じてzipファイルの内容を読み出すか、zipファイルに保存するかができます.
zipの内容を読み出す
簡単です.zipfileオブジェクトはread(name)の方法を提供します.nameはzipファイルの1つのファイルエントリで、実行が完了すると、読み出した内容が返され、思いついたファイルに保存すればいいです.
zipファイルへの書き込み
既存のファイルを直接書き込む方法と、文字列を書き込む方法の2つがあります.
zipfileオブジェクトを使用する最初のwrite(filename,arcname,compress_type)では、後の2つのパラメータは無視できます.最初のパラメータはファイル名で、2番目のパラメータはzipファイルの名前を表し、与えられていない場合はfilenameと同じ名前を使用することを示します.compress_typeはzipfileの作成時のパラメータを上書きできる圧縮フラグです.2つ目はzipfileオブジェクトを使用するwritestr(zinfo_or_arcname,bytes)で、1つ目のパラメータはzipinfoオブジェクトまたは圧縮ファイルに書き込まれた圧縮名で、2つ目のパラメータは文字列です.この方法を使用すると、ファイルの内容を動的に整理できます.
なお、読み出し時には、コンテンツのみが読み出されるため、zipファイルをディレクトリ構造で展開するには、ディレクトリの作成、ファイルの作成、書き込みなど、自分で行う必要があります.書き込み時には、zipファイル内のディレクトリ構造を必要に応じて動的に整理することができ、元のディレクトリ構造に従ってzipファイルを生成しないことができます.
そこで私は使いやすいように、自分のZFileクラスを作成しました.主に実現象winrarの右クリックメニューの圧縮機能です.zipファイルを指定したディレクトリに圧縮し、自動的に対応するサブディレクトリを作成します.またzipファイルの生成を容易にすることもできます.クラスソース:

# coding:cp936
# Zfile.py
# xxteach.com
import zipfile
import os.path
import os
class ZFile(object):
  def __init__(self, filename, mode='r', basedir=''):
    self.filename = filename
    self.mode = mode
    if self.mode in ('w', 'a'):
      self.zfile = zipfile.ZipFile(filename, self.mode, compression=zipfile.ZIP_DEFLATED)
    else:
      self.zfile = zipfile.ZipFile(filename, self.mode)
    self.basedir = basedir
    if not self.basedir:
      self.basedir = os.path.dirname(filename)
  def addfile(self, path, arcname=None):
    path = path.replace('//', '/')
    if not arcname:
      if path.startswith(self.basedir):
        arcname = path[len(self.basedir):]
      else:
        arcname = ''
    self.zfile.write(path, arcname)
  def addfiles(self, paths):
    for path in paths:
      if isinstance(path, tuple):
        self.addfile(*path)
      else:
        self.addfile(path)
  def close(self):
    self.zfile.close()
  def extract_to(self, path):
    for p in self.zfile.namelist():
      self.extract(p, path)
  def extract(self, filename, path):
    if not filename.endswith('/'):
      f = os.path.join(path, filename)
      dir = os.path.dirname(f)
      if not os.path.exists(dir):
        os.makedirs(dir)
      file(f, 'wb').write(self.zfile.read(filename))
def create(zfile, files):
  z = ZFile(zfile, 'w')
  z.addfiles(files)
  z.close()
def extract(zfile, path):
  z = ZFile(zfile)
  z.extract_to(path)
  z.close()


Pythonの関連内容についてもっと興味のある読者は、「Pythonファイルとディレクトリ操作技術要約」、「Pythonテキストファイル操作技術要約」、「Pythonデータ構造とアルゴリズムチュートリアル」、「Python Socketプログラミング技術総括」、「Python関数使用技術総括」、『Python文字列操作テクニック要約』及び『Python入門と進級経典教程』
ここではPythonプログラムの設計に役立つことを願っています.