【问题标题】:Python - tempfile.TemporaryFile cannot be read; why?Python - tempfile.TemporaryFile 无法读取;为什么?
【发布时间】:2010-11-15 05:28:53
【问题描述】:

official documentation for TemporaryFile 内容如下:

mode 参数默认为 'w+b' 以便可以读取创建的文件 并在没有关闭的情况下编写

然而,下面的代码并没有按预期工作:

import tempfile

def play_with_fd():
    with tempfile.TemporaryFile() as f:
        f.write('test data\n')
        f.write('most test data\n')

        print 'READ:', f.read()

        f.write('further data')

        print 'READ:', f.read()

        f.write('even more')
        print 'READ:', f.read()

        print 'READ:', f.read()
        print 'READ:', f.read()

if __name__ == '__main__':
    play_with_fd()

我得到的输出是:

> python play.py 
READ: 
READ: 
READ: 
READ: 
READ: 

谁能解释这种行为?有没有办法从临时文件中读取? (不必使用不会自动删除文件的低级 mkstemp;而且我不关心命名文件)

【问题讨论】:

  • 使用flush 没有帮助。

标签: python file io temporary-files


【解决方案1】:

你必须放

f.seek(0)

在尝试读取文件之前(这会将您带到文件的开头),并且

f.seek(0, 2)

返回到最后,这样您就可以保证不会覆盖它。

【讨论】:

  • 我会使用f.seek(0, os.SEEK_END)而不是f.seek(0, 2)
  • 很困惑为什么我不能read() 任何东西,开始搞乱delete=Truetry...finally: os.remove()...都是因为我忘记了os.seek()!为我节省了 10 行丑陋的代码
【解决方案2】:

read() 不返回任何内容,因为您位于文件末尾。您需要先调用seek(),然后read() 才会返回任何内容。比如把这行放在第一个read()前面:

f.seek(-10, 1)

当然,在再次写信之前,请务必将seek() 写到最后(如果你想继续写信的话)。

【讨论】: