Я использую ZipFile модуль питона, чтобы извлечь архив .zip (Давайте этот файл на http://img.dafont.com/dl/?f=akvaleir, например.)Извлечение файлов с недопустимыми символами в имени файла с Python
f = zipfile.ZipFile('akvaleir.zip', 'r')
for fileinfo in f.infolist():
print fileinfo.filename
f.extract(fileinfo, '.')
Его выход:
Akval�ir_Normal_v2007.ttf
Akval�ir, La police - The Font - Fr - En.pdf
Оба файла недоступны после извлечения, поскольку в именах файлов есть недопустимые кодированные символы. Проблема в zipfile-модуле не имеет возможности указывать выходные имена файлов.
Однако «распакуйте akvaleir.zip» экранирует имя файла также:
[email protected]:~# unzip akvaleir.zip
Archive: akvaleir.zip
inflating: AkvalВir_Normal_v2007.ttf
inflating: AkvalВir, La police - The Font - Fr - En.pdf
Я попытался захватить выход «распакуйте -l akvaleir.zip» в моей питона программе, и эти два имена файлов:
Akval\xd0\x92ir_Normal_v2007.ttf
Akval\xd0\x92ir, La police - The Font - Fr - En.pdf
Как я могу получить правильное имя файла, как то, что делает команда unzip без захвата вывода «unzip -l akvaleir.zip»?
@Alex, спасибо, все работает. Вы знаете, как избежать недопустимого имени файла в python так же, как распаковать? – jack
+1 не используйте 'extract' или' extractall', если вы не проверили все имена файлов, так как это может вытолкнуть файлы в любом месте вашей файловой системы. – bobince
@jack, конечно, похоже, что они кодируют его в utf-8, но я не знаю, какую кодировку использует сам zipfile - попробуйте распечатать реестр имен файлов, как это происходит с Python из zipfile, Посмотрим, можем ли мы догадаться, что кодировка тоже (в основном вы будете декодировать имя файла в unicode, с любым кодеком, который он использует, а затем закодировать его в utf-8 для сохранения файла). –