tempfile.TemporaryFile似乎为空

时间:2019-05-14 16:55:23

标签: python temporary-files

我正在通过从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 个答案:

答案 0 :(得分:2)

您正在寻找文件结尾。当您结束时,没有更多的阅读内容了。您应该从头开始。

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(),因为我认为它不依赖于操作系统。