Проблемы Юникода с 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