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

时间:2012-02-23 22:33:47

标签: python

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

运行此测试脚本时,temp2.​​csv将被截断并且temp1.csv 将与原始CSV的大小相同。

我正在使用Python 2.7.1。

您可以从http://explore.data.gov/Energy-and-Utilities/Residential-Energy-Consumption-Survey-RECS-Files-A/eypy-jxs2

下载示例CSV
#!/usr/bin/env python

import tempfile
import shutil


def main():
    f = open('RECS05alldata.csv')
    data = f.read()
    f.close()

    f = open('temp1.csv', 'w+b')
    f.write(data)
    f.close()

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

if __name__ == '__main__':
    main()

3 个答案:

答案 0 :(得分:9)

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

答案 1 :(得分:2)

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

这与NamedTemporaryFile无关。

答案 2 :(得分:0)

我认为您的问题是,当您致电shutil.copy时,Python并未将整个文件刷新到磁盘。

更改

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')