8

test.txtzip archive 内にファイルがありますtest.zip。圧縮されていると、アクセス許可test.txtは制御できなくなりますが、グループで書き込み可能にしたいのです。Python でファイルを抽出していますが、シェルにエスケープしたくありません。

編集: これが私がこれまでに得たものです:

import zipfile

z = zipfile.ZipFile('test.zip', 'w')
zi = zipfile.ZipInfo('test.txt')
zi.external_attr = 0777 << 16L
z.writestr(zi, 'FOO')
z.close()

z = zipfile.ZipFile('test.zip', 'r')
for name in z.namelist():
    newFile = open(name, "wb")
    newFile.write(z.read(name))

    newFile.close()
z.close()

これは 2.5.1 を使用する OS X では完全に動作しますが、私のホーム ボックス (Debian、Python 2.4 & 2.5) または Python 2.4 を使用する RHEL 5 では動作しません。OS X 以外ではエラーにはなりませんが、パーミッションも変更されません。理由はありますか?また、どのように機能しwritestr()ますか?私はここでそれを間違って使用していることを知っています。

これを行わずにこれを行う方法はありますか(ファイルを抽出するユーザーには、抽出後os.chmodに使用する権限がありません)。os.chmodzip ファイルへの完全な書き込みアクセス権があります。

より詳しい情報:

> ls -l test.zip
-rwxrwxrwx 1 myuser mygroup 2008-11-11 13:24 test.zip
> unzip test.zip
Archive:  test.zip
  inflating: test.txt 
> ls -l test.txt
-rw-r--r-- 1 myuser mygroup 2008-11-11 13:34 test.txt

ユーザー抽出は ではなくmyuserにありmygroupます。

4

4 に答える 4

6

私はあなたと同様の問題を抱えていたので、ここに私のものからのコードスピネットがあります。これはここで役立つと思います。

# extract all of the zip
for file in zf.filelist:
    name = file.filename
    perm = ((file.external_attr >> 16L) & 0777)
    if name.endswith('/'):
        outfile = os.path.join(dir, name)
        os.mkdir(outfile, perm)
    else:
        outfile = os.path.join(dir, name)
        fh = os.open(outfile, os.O_CREAT | os.O_WRONLY , perm)
        os.write(fh, zf.read(name))
        os.close(fh)
    print "Extracting: " + outfile

同様のことを行うこともできますが、独自のロジックを挿入してパーマ値を計算します。ここでは Python 2.5 を使用していることに注意してください。Python の zipfile サポートの一部のバージョンとの互換性がないことを認識しています。

于 2009-02-27T20:12:53.857 に答える
1

ドキュメントによると、 unzip は unix で保存されているものにアクセス許可を設定します。また、シェルの umask は使用されません。ファイルを圧縮する前にパーマが設定されていることを確認することをお勧めします。

それはできないので、しようとしていたことを試して実行する必要があります (そして、Debian で動作するようにします)。

一部のシステムで書き込み中のファイルのモードに writestr のモードを設定したり、zip システムを UNIX ではなく Windows に設定したりするなど、Python の zipfile ライブラリには多くの問題がありました。したがって、一貫性のない結果は、何も変わっていないことを意味する場合があります。

したがって、あなたは完全に運が悪いかもしれません。

于 2008-11-11T04:10:07.080 に答える
0

stdout に抽出 (unzip -p) してファイルにリダイレクトしますか? zip に複数のファイルがある場合は、zip の内容を一覧表示してから、一度に 1 つずつ抽出できます。

for n in `unzip -l test.zip | awk 'NR > 3 && NF == 4 { print $4 }'`; do unzip -p test.zip $n > $n; done

(ええ、私はあなたがこの 'python' のタグを付けたことを知っています :-) )

于 2008-11-11T04:16:56.257 に答える