Найти - Пользователи
Полная версия: кодировка названий файлов в zip-архиве
Начало » Python для новичков » кодировка названий файлов в zip-архиве
1
Cora
Модуль zipfile из стандартной библиотеки Python 3.0 не понимает русские буквы в названиях заархивированных файлов. Какую кодировку надо ставить? Я перепробовала и utf-8, и 1251, и кои8, и исо.

Я так понимаю, менять надо в этом месте:
if flags & 0x800:
# UTF-8 file names extension
filename = filename.decode('utf-8')
else:
# Historical ZIP filename encoding
filename = filename.decode('cp437')

Заранее спасибо
Андрей Светлов
имена должны быть unicode - дальше zipfile сам разберется
Cora
А как их сделать unicode? Если, например, zip-архив из Инета скачан?
Андрей Светлов
на распаковке все просто: по стандарту имена могут быть или utf-8 или не указаны. Различаются битом в флагах, как вы видели. Питон сам понимает этот бит и пытается работать соответственно. Если кодировка не указана - лучше думать, что это ascii.
Беда в том, что некоторые относительно старые версии архиваторов (по крайней мере для винды) упаковывали файлы в mbcs. В случае русских букв это означает cp1251. zipfile, когда видит такое безобразие - сильно смущается. Красиво чинить его довольно долго, зато сделать грязный monkey patch FileInfo._decodeFilename - 5 минут.
Cora
Как сделать? Я правильно понимаю, что надо в своем коде этот monkey patch прописывать? Можно пример, пожалуйста?

Например, как исправить:
def zipdir(zipname):
“”“выдает список файлов в zip-архиве”“”
arc = zipfile.ZipFile(zipname, ‘r’)
return arc.namelist()

Или хотя бы куда посмотреть за аналогичными примерами по кодировкам?
Андрей Светлов
def zipdir(zipname):
"""выдает список файлов в zip-архиве"""
store = zipfile.ZipInfo._decodeFilename
def _decodeFilename(self):
return self.filename.decode('cp1251')
zipfile.ZipInfo._decodeFilename = _decodeFilename
try:
arc = zipfile.ZipFile(zipname, 'r')
return arc.namelist()
finally:
zipfile.ZipInfo._decodeFilename = store
Cora
Спасибо большое, Андрей. Все равно закорючки пишет, но, по крайней мере, хоть что-то еще можно попробовать
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB