【问题标题】:tempfile.TemporaryFile seems empty even though it's nottempfile.TemporaryFile 似乎是空的,即使它不是
【发布时间】:2019-05-15 01:12:47
【问题描述】:

我正在通过从 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),仍然没有打印行。只有一个空行。

【问题讨论】:

标签: python temporary-files


【解决方案1】:

您正在寻找文件的末尾。当你走到最后时,没有什么可读的了。您应该从头开始。

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

【讨论】:

  • 不确定是否可以在无服务器环境中执行此操作,我现在就试试。谢谢。
  • 如果使用tempfile.NamedTemporaryFile(),如果使用delete=False 来创建它,可以重新打开它......但当然这也意味着它必须是不再需要时显式删除。
猜你喜欢
  • 2014-03-13
  • 1970-01-01
  • 2020-01-12
  • 2019-04-18
  • 2013-07-12
  • 2018-12-08
  • 1970-01-01
  • 1970-01-01
  • 2020-01-31
相关资源
最近更新 更多