временный файл кажется пустым, хотя это не так - PullRequest
0 голосов
/ 14 мая 2019

Я пишу во временный файл, загружая файл с S3. Когда я открываю загруженный файл (называемый 3) в моем текстовом редакторе, я вижу все строки текста. Но мой код ничего не возвращает, когда я пытаюсь прочитать файл построчно.

После запуска кода временный файл создается в каталоге скрипта Python и не исчезает.

import tempfile
import os

import boto3

s3 = boto3.client('s3')

with tempfile.TemporaryFile() as tf:
  try:
    s3.download_file(
      Bucket='the-chumiest-bucket',
      Key='path/to/the/file.txt',
      Filename=str(tf.name)
    )
  except Exception as e:
    print('error:', e)

  tf.flush()
  tf.seek(0, os.SEEK_END)

  for line in tf.readlines():
    print('line:', line)

Если я бегу

with open('3', 'r') as f:
  for line in f.readlines():
    print(line)

Я получил строки, так что это может быть обходной путь, но я видел, как многие люди читали строки из временного файла, используя этот точный метод.

Ожидаемый результат:

Я получил напечатанные строки в file.txt.

Фактический результат:

Я ничего не напечатал.

Редактировать # 1

Изменено tf.seek(0, os.SEEK_END) на tf.seek(0, os.SEEK_SET) (спасибо @Barmar) и по-прежнему не печатаются строки. Всего одна пустая строка.

1 Ответ

2 голосов
/ 14 мая 2019

Вы ищете в конец файла.Больше нечего читать, когда ты в конце.Вы должны увидеть начало.

tf.seek(0, os.SEEK_SET)

Я подозреваю, что другая проблема заключается в том, что вы обновляете файл вне потока tf.Он не возвращается к файловой системе, чтобы прочитать содержимое файла.tf.flush() очищает выходной буфер, но это ничего не делает, так как вы не записали в поток.

Вместо поиска в потоке tf снова откройте файл:

with open(tf.name) as tf1:
  for line in tf1.readlines():
    print('line:', line)

Обратите внимание, что вы должны использовать tempfile.NamedTemporaryFile, чтобы получить файл с именем.И повторное открытие файла работает только на Unix, а не Windows.Возможно, вы захотите использовать tempfile.mkstemp() вместо этого, так как я не думаю, что это зависит от ОС.

...