4

pythons zipfileモジュールを使用して zip ファイルのエントリを更新したいと思います。私の問題は、これが新しいエントリを生成することです。

私はこのコードを持っていると仮定してください:

from zipfile import ZipFile,ZIP_DEFLATED
with ZipFile("myfile.zip","w") as z:
    z.writestr("hello.txt", "the content of hello.txt", ZIP_DEFLATED)
    ###  how to update the hello.txt file here ?
    z.writestr("hello.txt", "the content of hello.txt", ZIP_DEFLATED)

この後、実際の zip ファイルには 1 つではなく 2 つのエントリがあります。

$ unzip -l myfile.zip 
Archive:  myfile.zip
  Length      Date    Time    Name
---------  ---------- -----   ----
       24  2013-02-19 22:48   hello.txt
       24  2013-02-19 22:48   hello.txt
---------                     -------
       48                     2 files
$ python --version
Python 3.3.0
$

完全に新しいファイルを書き込む方法は知っていますが、コンテンツが大きいと時間がかかります。

zip(1)ユーティリティはこれを行うことができます (「-u」オプションを使用)。Pythonを使用してこれを達成する方法はありますか?

ありがとう

4

2 に答える 2

6

このzip形式には、アーカイブ内のファイルを削除または置換する簡単な方法がありません。その場でできるライブラリがあるかもしれませんが、私は知りません。

ちょっと待って:

zip(1) ユーティリティはこれを行うことができます (「-u」オプションを使用)。

まず、-u「タイムスタンプが新しくない場合にのみ既存のファイルを置き換える」ように指示するだけですが、これはここではあまり関係ありません。it will still がなければ、-uデフォルトのコマンドはaddで、タイムスタンプをチェックせずに同じことを行います:

既存のエントリを更新し、新しいファイルを追加します。アーカイブが存在しない場合は作成します。これがデフォルトのモードです。

しかし、もっと重要なことは、あなたが参照したマンページが明示的に述べているように:

圧縮ファイル。既存の zip アーカイブを変更する場合、zip は新しい内容で一時ファイルを書き込み、新しいバージョンの作成プロセスがエラーなしで完了した場合にのみ古いものを置き換えます。

そして、それはまさにあなたがやりたいことです: 完全な新しいファイルを一時的な場所に書き込んでから、元のファイルを新しいファイルに置き換えます。

Windowsで動作させる必要がある場合、これは少し面倒です。(そうでない場合は、 and を使用tempfile.NamedTemporaryFileしてos.renameください。)しかし、あなたはすでにそれを行う方法を知っています:

完全に新しいファイルを書き込む方法は知っていますが、コンテンツが大きいと時間がかかります。

時間がzip -uかかりすぎるだけです。

于 2013-02-20T00:20:03.590 に答える
0

zipfileモジュールがあなたが望むようにアーカイブを変更できるとは思えません。可能であれば、からファイルを削除する方法がありますがZipFile、それはありません。

于 2013-02-19T22:49:44.027 に答える