4

Python の zipfile モジュールを使用して .zip アーカイブを抽出します (たとえば、このファイルをhttp://img.dafont.com/dl/?f=akvaleirにあるとします)。

f = zipfile.ZipFile('akvaleir.zip', 'r')
for fileinfo in f.infolist():
    print fileinfo.filename
    f.extract(fileinfo, '.')

その出力:

Akval�ir_Normal_v2007.ttf
Akval�ir, La police - The Font - Fr - En.pdf

ファイル名に無効なエンコード文字が含まれているため、抽出後に両方のファイルにアクセスできません。問題は、zipfile モジュールに出力ファイル名を指定するオプションがないことです。

ただし、「unzip akvaleir.zip」はファイル名を適切にエスケープします。

root@host:~# unzip akvaleir.zip 
Archive:  akvaleir.zip
  inflating: AkvalВir_Normal_v2007.ttf  
  inflating: AkvalВir, La police - The Font - Fr - En.pdf  

Python プログラムで「unzip -l akvaleir.zip」の出力をキャプチャしようとしましたが、これら 2 つのファイル名は次のとおりです。

Akval\xd0\x92ir_Normal_v2007.ttf
Akval\xd0\x92ir, La police - The Font - Fr - En.pdf

「unzip -l akvaleir.zip」の出力をキャプチャせずに、unzip コマンドのように正しいファイル名を取得するにはどうすればよいですか?

4

3 に答える 3

8

少し時間がかかりましたが、答えを見つけたと思います。

その言葉はAkvaléirだと思っていました。それについてフランス語で書かれたページの説明を見つけました。あなたのコードスニペットを使用したとき、次のような文字列がありました

>>> fileinfo.filename
'Akval\x82ir, La police - The Font - Fr - En.pdf'
>>> 

これは、UTF8、Latin-1、CP-1251、または CP-1252 エンコーディングでは機能しませんでした。その後、CP863 はカナダのエンコーディングである可能性があることを発見したため、おそらくこれはフランス語圏のカナダのものでした。

>>> print unicode(fileinfo.filename, "cp863").encode("utf8")
Akvaléir, La police - The Font - Fr - En.pdf
>>> 

ただし、次にZipファイル形式の仕様を読みました

ZIP 形式は、歴史的に、一般に IBM Code Page 437 と呼ばれる元の IBM PC 文字エンコード セットのみをサポートしてきました。

...

汎用ビット 11 が設定されている場合、ファイル名とコメントは、UTF-8 ストレージ仕様で定義された文字エンコード形式を使用して、Unicode 標準、バージョン 4.1.0 以降をサポートする必要があります。

それをテストすると、カナダのコードページと同じ答えが得られます

>>> print unicode(fileinfo.filename, "cp437").encode("utf8")
Akvaléir, La police - The Font - Fr - En.pdf
>>>

私は Unicode でエンコードされた zip ファイルを持っていないし、見つけるために作成するつもりもないので、すべての zip ファイルが cp437 エンコーディングを持っていると仮定します。

import shutil
import zipfile

f = zipfile.ZipFile('akvaleir.zip', 'r')
for fileinfo in f.infolist():
    filename = unicode(fileinfo.filename, "cp437")
    outputfile = open(filename, "wb")
    shutil.copyfileobj(f.open(fileinfo.filename), outputfile)

与える私のMacで

 109936 Nov 27 01:46 Akvale??ir_Normal_v2007.ttf
  25244 Nov 27 01:46 Akvale??ir, La police - The Font - Fr - En.pdf

どのタブ補完

ls Akvale\314\201ir

私のファイルブラウザには素敵な「é」が表示されます。

于 2009-11-27T09:49:45.440 に答える
7

メソッドの代わりにextractメソッドを使用してopen、結果の疑似ファイルを任意の名前でディスクに保存しshutil.copyfileobjます。

于 2009-11-27T06:33:02.030 に答える