Проблеми с Unicode с tarfile.extractall() (Python 2.7)

Използвам python 2.7.6 в Windows и използвам модула tarfile за извличане на файл като gzip файл. Опцията mode на tarfile.open() е зададена на "r:gz". След отвореното повикване, ако трябваше да отпечатам съдържанието на архива чрез tarfile.list(), виждам следната директория в списъка:

./静态分析 Part 1.v1/

Въпреки това, след като извикам tarfile.extractall(), не виждам горната директория в извлечения списък с файлове, вместо това виждам това:

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

Ако трябваше да извлека архива чрез 7zip, виждам директория със същото име като първия елемент по-горе. Така че очевидно методът extractall() се прецаква, но не знам как да го поправя.


person DigitalEye    schedule 21.06.2016    source източник


Отговори (1)


Научих, че tar не запазва информацията за кодиране като част от архива и третира имената на файловете като необработени последователности от байтове. И така, изходът, който видях от tarfile.extractall(), беше просто необработена последователност от знаци, която съдържаше името на файла преди компресирането. За да накарате метода extractall() да пресъздаде оригиналните имена на файлове, открих, че трябва ръчно да конвертирате members на обекта TarFile в подходящото кодиране, преди да извикате extractall(). В моя случай следното свърши работа:

  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

person DigitalEye    schedule 21.06.2016