tempfile.TemporaryFile 似乎是空的,尽管它不是
tempfile.TemporaryFile seems empty even though it's not
我正在通过从 S3 下载文件写入临时文件。当我在文本编辑器中打开下载的文件(名为 3
)时,我可以看到所有文本行。但是当我尝试逐行读取文件时,我的代码 returns 什么也没有。
在 运行 代码之后,临时文件在 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),但仍然没有打印任何行。只有一个空行。
您正在查找文件末尾。当你读到最后时,没有什么可读的了。你应该从头看到。
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()
,因为我认为它没有 OS-dependency.
我正在通过从 S3 下载文件写入临时文件。当我在文本编辑器中打开下载的文件(名为 3
)时,我可以看到所有文本行。但是当我尝试逐行读取文件时,我的代码 returns 什么也没有。
在 运行 代码之后,临时文件在 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),但仍然没有打印任何行。只有一个空行。
您正在查找文件末尾。当你读到最后时,没有什么可读的了。你应该从头看到。
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()
,因为我认为它没有 OS-dependency.