23

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;而且我不关心命名文件)

4

2 回答 2

37

你必须把

f.seek(0)

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

f.seek(0, 2)

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

于 2009-07-29T20:58:55.840 回答
7

read()不返回任何内容,因为您位于文件末尾。你需要先打电话seek()才能read()返回任何东西。例如,将此行放在第一行的前面read()

f.seek(-10, 1)

当然,在再次写之前,一定要写到seek()最后(如果那是你想继续写的地方)。

于 2009-07-29T20:43:00.293 回答