Модуль Python Zipfile с TextIOWrapper - PullRequest
4 голосов
/ 22 октября 2011

Я написал следующий фрагмент кода для чтения текстового файла в zip-каталоге. Поскольку я не хочу вывод в байтах, я добавил TextIOWrapper для отображения вывода в виде строки. Если предположить, что это правильный способ читать файл zip построчно (если он не сообщает мне), то почему вывод выводит пустую строку? Есть ли способ избавиться от этого?

import zipfile
import io

def test():
    zf = zipfile.ZipFile(r'C:\Users\test\Desktop\zip1.zip')
    for filename in zf.namelist():
        words = io.TextIOWrapper(zf.open(filename, 'r'))
        for line in words:
            print (line)
    zf.close()

test()

>>> 
This is a test line...

This is a test line...
>>> 

The two lines in the file inside of the zipped folder are:
This is a test line...
This is a test line...

Спасибо! * * 1004

1 Ответ

4 голосов
/ 22 октября 2011

zipfile.open открывает заархивированный файл в двоичном режиме, в котором не удаляются возвраты каретки (т. Е. '\ R'), а также значения по умолчанию для TextIOWrapper в моем тесте. Попробуйте настроить TextIOWrapper для использования универсальных символов новой строки (т.е. newline=None):

import zipfile
import io

zf = zipfile.ZipFile('data/test_zip.zip')
for filename in zf.namelist():
    with zf.open(filename, 'r') as f:
        words = io.TextIOWrapper(f, newline=None)
        for line in words:
            print(repr(line))

Выход:

'This is a test line...\n'
'This is a test line...'

Обычное поведение при итерации файла за строкой в ​​Python - сохранение новой строки в конце. Функция print также добавляет новую строку, поэтому вы получите пустую строку. Чтобы просто напечатать файл, вы можете вместо этого использовать print(words.read()). Или вы можете использовать опцию end функции печати: print(line, end='').

...