как мне написать строки в файл с именем, а затем распечатать каждую строку

#python #zip #temporary-files

Вопрос:

Я пытаюсь распаковать zip-файл, содержащий csv-файл, и записать все строки из csv-файла в NamedTemporaryFile. Затем распечатайте строки из временного файла, чтобы убедиться, что он правильно написал нужные строки. Это мой текущий код, который при вызове «печать(строка)» возвращает пустое значение.

 with zipfile.ZipFile(file_name) as zip_fp:
        for item in zip_fp.namelist():
            temp_file = NamedTemporaryFile()
            with zip_fp.open(item) as fp:
                with open(temp_file.name, mode='wb ') as temp_fp:
                    temp_fp.writelines(fp.readlines())
                    for line in temp_fp:
                        print(line)
 

Пожалуйста, помогите.

Ответ №1:

Это потому temp_fp.writelines(fp.readlines()) , что он записал все строки в файл, и курсор теперь находится в конце файла, так что вы ничего не получите. Попробуйте приведенный ниже код (последние 3 строки добавлены в ваш код).:

 with zipfile.ZipFile(file_name) as zip_fp:
        for item in zip_fp.namelist():
            temp_file = NamedTemporaryFile()
            with zip_fp.open(item) as fp:
                with open(temp_file.name, mode='wb ') as temp_fp:
                    temp_fp.writelines(fp.readlines())
                with open(temp_file.name, mode='r') as temp_fp:
                    for line in temp_fp:
                        print (line)
                
 

ИЛИ — seek в начало файла и прочитайте всю строку:

 with zipfile.ZipFile(file_name) as zip_fp:
        for item in zip_fp.namelist():
            temp_file = NamedTemporaryFile()
            with zip_fp.open(item) as fp:
                with open(temp_file.name, mode='wb ') as temp_fp:
                    temp_fp.writelines(fp.readlines())
                    # SEEK TO START OF FILE
                    temp_fp.seek(0,0)
                    for line in temp_fp:
                        print (line)
                
 

Комментарии:

1. Оба этих ответа сохраняют zip-файл открытым, когда в этом нет необходимости. Кроме того, firs ошибается, так как он открывает файл в режиме записи , а не чтения

2. Ой, копипаст, в любом случае обновлена вторая часть, чтобы открыть файл в режиме чтения

3. Нет проблем 🙂 Рад, что смог помочь!

Ответ №2:

Причина в том, что запись ведется до конца файла, поэтому читать больше нечего. Этот код:

 with zip_fp.open(item) as fp:
     with open(temp_file.name, mode='wb ') as temp_fp:
         temp_fp.writelines(fp.readlines())
             for line in temp_fp:
                 print(line)
 

Делает следующее:

  • откройте молнию как fp:
  • откройте временный файл как temp_fp
  • пишите с начала temp_fp (так как мы не находимся в режиме добавления).
  • прочитайте что-нибудь после окончания файла (т. е. Ничего).

Нет причин проверять, сработало ли письмо: оно сработает. Однако, если бы вы хотели это сделать, что-то подобное сработало бы:

 with zip_fp.open(item) as fp, temp_file.open("wb ") as tmpf:
    for line in fp:
        tmpf.writelines([line])
with tmp_file.open("rb") as tmpf:
    for line in tmpf:
        print(line)
 

Обратите внимание на несколько исправлений здесь—использование объектов path на всем протяжении, несколько строк в одной строке и предотвращение потери оперативной памяти путем прямой записи.

Кстати, должны ли они быть в двоичном режиме?