Python 为什么tempfile.NamedTemporaryFile()会截断我的数据?

Python 为什么tempfile.NamedTemporaryFile()会截断我的数据?,python,Python,这是我创建的一个测试,用来重现我使用时遇到的问题 tempfile.NamedTemporaryFile()。问题是当我使用temp文件时 我的CSV中的数据在文件末尾被截断 运行此测试脚本时,temp2.csv将被截断,temp1.csv将被删除 将与原始CSV大小相同 我正在使用Python 2.7.1 您可以从下载示例CSV 在关闭文件之前先复制它。文件被缓冲,这意味着在等待写入文件时,其中一些文件将保留在缓冲区中。close将把缓冲区中的所有剩余数据写入文件,作为文件关闭的一部分 这与N

这是我创建的一个测试,用来重现我使用时遇到的问题 tempfile.NamedTemporaryFile()。问题是当我使用temp文件时 我的CSV中的数据在文件末尾被截断

运行此测试脚本时,temp2.csv将被截断,temp1.csv将被删除 将与原始CSV大小相同

我正在使用Python 2.7.1

您可以从下载示例CSV


在关闭文件之前先复制它。文件被缓冲,这意味着在等待写入文件时,其中一些文件将保留在缓冲区中。
close
将把缓冲区中的所有剩余数据写入文件,作为文件关闭的一部分


这与
NamedTemporaryFile

无关,我认为您的问题在于,在调用
shutil.copy时,Python没有将整个文件刷新到磁盘

改变

temp = tempfile.NamedTemporaryFile()
temp.write(data)
shutil.copy(temp.name, 'temp2.csv')
temp.close()


在temp.write(data)之后添加temp.flush()。

或者如果您不想关闭文件,但确实想将数据写出来。@BrendanLong,您通常不想复制文件,直到您完成它-但您的观点是有效的。Python 2.6+有一个
delete=True
参数用于此方法,“If delete为True(默认值)”,文件一关闭就被删除“如果您假定此操作与
open()
方法的行为相同,并且在复制前本能地
close()
名为临时文件的
NamedTemporaryFile
,则可能会产生混淆,因为它将消失,并且复制将出错
flush()
是这里的解决方案。这是可行的,但似乎有点违反直觉。在我看来,temp.flush()应该先于temp.write(数据)。这是我以前试过的,但没有用。我希望我能更好地理解为什么将其放在write()之后才有效。这在Python2.6+上不起作用,请参见
delete
参数
temp = tempfile.NamedTemporaryFile()
temp.write(data)
shutil.copy(temp.name, 'temp2.csv')
temp.close()
temp = tempfile.NamedTemporaryFile()
temp.write(data)
temp.close()
shutil.copy(temp.name, 'temp2.csv')