ホームページ  >  記事  >  バックエンド開発  >  Python で ZIP ファイルを圧縮および解凍する方法

Python で ZIP ファイルを圧縮および解凍する方法

黄舟
黄舟オリジナル
2017-10-04 09:26:051630ブラウズ

この記事では、主に Python で ZIP ファイルを圧縮および解凍する方法を紹介し、具体的な例の形式で ZIP ファイルを圧縮および解凍するための Python の一般的な操作テクニックを分析します。この記事では、ZIP ファイルを圧縮および解凍するための Python メソッドの実装について説明しています。参考のために皆さんと共有してください。詳細は次のとおりです:

Python では zip ファイルを使用する必要がある場合があります。バージョン 1.6 では、Python はそのような操作を実行するための zipfile モジュールをすでに提供しています。ただし、Python の zipfile モジュールはマルチボリュームの状況を処理できませんが、このような状況はまれであるため、通常の使用には十分です。以下に、ほとんどの状況に十分対応できる、基本的な zipfile 操作をいくつか記録しました。

zipfile モジュールを使用すると、zip ファイルを開いたり書き込んだりできます。例:

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

これは、zip ファイルを開きます。モードが「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 ファイル内のファイル エントリです。実行が完了すると、読み取った内容が目的のファイルに保存されます。

zip ファイルを記述するには 2 つの方法があります

。1 つは既存のファイルに直接書き込む方法、もう 1 つは文字列を書き込む方法です。

zipfile オブジェクトを使用した最初の write(filename, arcname, compress_type) では、最後の 2 つのパラメーターは無視できます。最初のパラメータはファイル名で、2 番目のパラメータは zip ファイル内の名前です。指定しない場合は、ファイル名と同じ名前が使用されます。 compress_type は、zip ファイルの作成時にパラメータをオーバーライドする圧縮フラグです。 2 番目の方法は、zipfile オブジェクトの writestr(zinfo_or_arcname, bytes) を使用する方法です。最初のパラメータは zipinfo オブジェクトまたは圧縮ファイルに書き込まれる圧縮名で、2 番目のパラメータは文字列です。このメソッドを使用して、ファイルの内容を動的に整理します。

なお、読み込みの際は中身のみを読み込むことができるため、ディレクトリ構造に合わせてzipファイルを展開したい場合は、ディレクトリの作成、ファイルの作成、書き込みなどの操作を自分で行う必要があります。 。書き込み時に、zip ファイル内のディレクトリ構造を必要に応じて動的に整理できるため、元のディレクトリ構造に従わずに zip ファイルを生成できます。

そこで、使いやすさを考慮して、独自の ZFile クラスを作成しました。このクラスは、主に winrar の右クリック メニューにある圧縮機能を実装しています。つまり、zip ファイルを指定したディレクトリに圧縮し、対応するサブディレクトリを自動的に作成します。もう 1 つは、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 で ZIP ファイルを圧縮および解凍する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。