Редактировать Для Python 3, используя io.TextIOWrapper
, как описывает Дж. Ф. Себастьян, лучший выбор. Ответ ниже может быть полезен для 2.x. Я не думаю, что что-то ниже на самом деле неверно даже для 3.x, но io.TestIOWrapper
все еще лучше.
Если файл UTF-8, это будет работать:
# the rest of the code as above, then:
with zfile.open(name, 'rU') as readFile:
line = readFile.readline().decode('utf8')
# etc
Если вы собираетесь быть итерация над файлом, вы можете использовать codecs.iterdecode
, но это не будет работать с readline()
.
with zfile.open(name, 'rU') as readFile:
for line in codecs.iterdecode(readFile, 'utf8'):
print line
# etc
Обратите внимание, что ни один подход не является безопасным для многобайтовых кодировок. Например, малоинтенсивный UTF-16 представляет символ новой строки с байтами b'\x0A\x00'
. Инструмент, не поддерживающий unicode, который ищет новые строки, будет неправильно разбит, оставив нулевые байты в следующей строке. В таком случае вам нужно будет использовать что-то, что не пытается разделить входными линиями новыми, например ZipFile.read
, а затем сразу декодировать всю строку байта. Это не относится к utf-8.
Мне кажется, что zip-библиотека не поддерживает параметры кодировки для 'open'. Если это правильно, я думаю, вам придется использовать оболочку 'codecs.EncodedFile' или вручную декодировать каждую строку. –
как я могу это сделать? –
Знаете ли вы правильную кодировку для файла? Это похоже на utf-8 для меня, но это плохая идея угадать, если вы можете избежать этого. –