2016-06-21 12 views
0

Ich verwende Python 2.7.6 unter Windows und ich bin mit dem tarfile Modul einer Datei, die eine gzip-Datei zu extrahieren. Die mode Option von tarfile.open() ist auf "r:gz" eingestellt. Nach dem öffentlichen Aufruf, wenn ich den Inhalt des Archivs über tarfile.list() gedruckt war, sehe ich das folgende Verzeichnis in der Liste:Unicode Probleme mit tarfile.extractall() (Python 2.7)

./静态分析 Part 1.v1/

Doch nach nenne ich tarfile.extractall(), I don‘ t das oben genannte Verzeichnis in der extrahierten Liste der Dateien, stattdessen sehe ich:

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

Wenn ich das Archiv über 7zip zu extrahieren war, sehe ich ein Verzeichnis mit dem gleichen Namen wie der ersten Eintrag oben. Also, klar, die extractall() Methode ist vermasseln, aber ich weiß nicht, wie das zu beheben ist.

Antwort

0

ich erfuhr, dass Teer behält nicht die Codierung Informationen als Teil des Archivs und behandelt Dateinamen als Ausgang Byte-Sequenzen. Also, die Ausgabe, die ich von tarfile.extractall() sah, war einfach raw die Zeichenfolge, die den Namen der Datei vor der Komprimierung umfasste. Um die extractall() Methode, um die ursprünglichen Dateinamen zu erstellen, entdeckte ich, dass Sie die members des TarFile Objekt in die entsprechende Codierung manuell zu konvertieren, bevor extractall() aufrufen. In meinem Fall habe folgendes den Trick:

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) 

Der obige Code auf dieser Super-User Antwort basiert: https://superuser.com/a/190786/354642