88

私は少しヘルパー関数を作りました:

import zipfile

def main(archive_list=[],zfilename='default.zip'):
    print zfilename
    zout = zipfile.ZipFile(zfilename, "w")
    for fname in archive_list:
        print "writing: ", fname
        zout.write(fname)
    zout.close()

if __name__ == '__main__':
    main()  

問題は、すべてのファイルが圧縮されていないことです。ファイルは同じサイズであり、事実上、拡張子だけが「.zip」に変更されています(この場合は「.xls」から)。

私はwinXPsp2でpython2.5を実行しています。

4

3 に答える 3

169

これはZipFile、圧縮方法を指定する必要があるためです。指定しない場合は、圧縮方法がであると想定されzipfile.ZIP_STORED、ファイルは圧縮されずに保存されるだけです。メソッドを指定する必要がありますzipfile.ZIP_DEFLATEDzlibこのためにモジュールをインストールする必要があります(通常はデフォルトでインストールされます)。

import zipfile

def main(archive_list=[],zfilename='default.zip'):
    print zfilename
    zout = zipfile.ZipFile(zfilename, "w", zipfile.ZIP_DEFLATED) # <--- this is the change you need to make
    for fname in archive_list:
        print "writing: ", fname
        zout.write(fname)
    zout.close()

if __name__ == '__main__':
    main()  

更新:ドキュメント(python 3.7)に従って、デフォルトのZIP_STOREDをオーバーライドするには、「compression」引数の値を指定する必要があります。使用可能なオプションはZIP_DEFLATED、ZIP_BZIP2、またはZIP_LZMAであり、対応するライブラリzlib、bz2、またはlzmaが使用可能である必要があります。

于 2010-11-12T16:01:37.690 に答える
15

zipフォーマットを圧縮する本当に簡単な方法があり ます、

ライブラリで使用しshutil.make_archiveます。

例えば:

import shutil

shutil.make_archive(file_name, 'zip', file location after compression)

より広範なドキュメントは次の場所で見ることができます:ここ

于 2017-10-22T12:01:05.207 に答える
5

これが誰かに役立つことを願っています。すべてのzipモードをテストし、2つのデータセットでベンチマークしました。最初の1つは小さい(〜30 MB)、もう1つは大きい(〜1.5 GB)。それらはさまざまな種類のファイルで構成されていたため、実際のシナリオに可能な限り近いものになります。各データセットに対して、「比例」と「完全」の2つのテスト方法を実行しました。両方のテストは、平均を得るために次々に3回繰り返されました。これらの結果はマシンによって異なる場合がありますが、それでも開始するのに適した場所だと思います。

独自の専用バックアップソリューションを作成しようとしているため、2つの方法でテストを行いました。比例方式では、より多くのzipファイルが作成されますが、必要に応じて、より小さなデータパッケージを転送できます。変更されたものだけを置き換えます。それよりも複雑ですが、今は重要ではありません。

比例法の説明

完全な方法は、フォルダ全体をまっすぐに圧縮することです。

完全なメソッドの説明

圧縮率の計算:

size_difference = source_size --compressed_size

Compression_ratio =(size_difference * 100.0)/ source_size

基本的に、その数が多いほど良いです。

各zipアーカイブは次のように初期化されました。

# Mode tests
with zipfile.ZipFile(target_zip, 'w', compression_method) as ziph:

# Level tests
with zipfile.ZipFile(target_zip, 'w', compression_method, compresslevel=level) as ziph:

結果は次のとおりです。

研究成果

方法に関係なく、最適な圧縮モードはZIP_DEFLATEDのようです。アーカイブサイズが小さいだけでZIP_LZMAモードが得られましたが、それは%のほんの一部であり、大きなデータセットの場合は約8倍長くかかりました。

さらに、同じデータセットと方法でさまざまなレベルの圧縮を試しました。今回を除いて、レベルごとに1つの実行しかありませんでした。

研究成果

ZIP_DEFLATEDとZIP_BIP2には同様の圧縮機能があるように見えますが、2番目の圧縮機能ははるかに低速です。大規模なデータセットの場合、1または2の圧縮レベルで十分です。それ以上増やしても、最終的なファイルサイズに大きな影響はありません。ワークロードで多くの「小さな」zipファイルが必要な場合は、レベル9を使用することをお勧めします。これにより、高い圧縮率が得られますが、レベル1とほぼ同じ時間がかかります。

于 2021-05-07T21:25:04.733 に答える