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