Проблемы Юникода с 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 () не работает, но я не знаю, как это исправить.

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)

Приведенный выше код основан на ответе этого суперпользователя: /questions/43381243/testirovanie-lokalizatsii-formatirovanie-vseh-strok-s-xxxxx/43381265#43381265

Другие вопросы по тегам