2016-06-21 6 views
0

Windowsでpython 2.7.6を使用しています.tarfileモジュールを使用してgzipファイルを抽出しています。 tarfile.open()modeオプションは"r:gz"に設定されています。私はtarfile.list()を経由して、アーカイブの内容を印刷した場合、オープンコールの後、私は、リスト内の次のディレクトリを参照してください。tarfile.extractall()(Python 2.7)のUnicodeに関する問題

./静态分析 Part 1.v1/

しかし、私はtarfile.extractall()を呼び出した後、私はドン」私は7zipを経由してアーカイブを展開した場合、私は上記の最初の項目と同じ名前のディレクトリを参照してください

é™æ€åˆ†æž Part 1.v1/

:Tの代わりに、私はこれを参照してください、ファイルの抽出、リスト内の上記のディレクトリを参照してください。だから、明らかに、extractall()メソッドが失敗していますが、これを修正する方法はわかりません。

答えて

0

tarはアーカイブの一部としてエンコード情報を保持せず、ファイル名を生のバイトシーケンスとして扱うことを学びました。だから、tarfile.extractall()から見た出力は、圧縮前にファイルの名前を構成していた文字シーケンスではありませんでした。 extractall()メソッドで元のファイル名を再作成するには、extractall()を呼び出す前に、オブジェクトのmembersを適切なエンコーディングに手動で変換する必要があることが判明しました。私の場合は、次のようにトリックをした:

modeltar = tarfile.open(zippath, mode="r:gz") 
    updatedMembers = [] 
    for m in modeltar.getmembers(): 
    m.name = unicode(m.name, 'utf-8') 
    updatedMembers.append(m) 
    modeltar.extractall(members=updatedMembers, path=dbpath) 

上記のコードは、このスーパーユーザーの回答に基づいています。https://superuser.com/a/190786/354642