Форум сайта python.su
Модуль 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')
Заранее спасибо
Отредактировано (Март 2, 2010 17:22:49)
Офлайн
имена должны быть unicode - дальше zipfile сам разберется
Офлайн
А как их сделать unicode? Если, например, zip-архив из Инета скачан?
Офлайн
на распаковке все просто: по стандарту имена могут быть или utf-8 или не указаны. Различаются битом в флагах, как вы видели. Питон сам понимает этот бит и пытается работать соответственно. Если кодировка не указана - лучше думать, что это ascii.
Беда в том, что некоторые относительно старые версии архиваторов (по крайней мере для винды) упаковывали файлы в mbcs. В случае русских букв это означает cp1251. zipfile, когда видит такое безобразие - сильно смущается. Красиво чинить его довольно долго, зато сделать грязный monkey patch FileInfo._decodeFilename - 5 минут.
Офлайн
Как сделать? Я правильно понимаю, что надо в своем коде этот monkey patch прописывать? Можно пример, пожалуйста?
Например, как исправить:
def zipdir(zipname):
“”“выдает список файлов в zip-архиве”“”
arc = zipfile.ZipFile(zipname, ‘r’)
return arc.namelist()
Или хотя бы куда посмотреть за аналогичными примерами по кодировкам?
Отредактировано (Март 4, 2010 10:48:12)
Офлайн
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
Офлайн
Спасибо большое, Андрей. Все равно закорючки пишет, но, по крайней мере, хоть что-то еще можно попробовать
Офлайн