从python中的NamedTemporaryFile读取

时间:2014-02-07 17:33:23

标签: python temporary-files

我正在创建一个tempFile,然后通过编辑器打开它来添加文本(以便用户可以输入他的消息),然后保存它以从保存NamedTemporaryFile中读取文本。

with tempfile.NamedTemporaryFile(delete=False) as f:
    f.close()
    if subprocess.call([editor.split(" ")[0], f.name]) != 0:
        raise IOError("{} exited with code {}.".format(editor.split(" ")[0], rc))
    with open(f.name) as temp_file:
        temp_file.seek(0)
        for line in temp_file.readlines():
            print line

但每次它都是空白的。为什么会这样?

2 个答案:

答案 0 :(得分:1)

如果您使用SublimeText作为编辑器,则需要传入-w--wait参数,以确保Python程序等到实际再次关闭SublimeText为止。

否则,您将开始编辑该文件,并立即尝试读取其当时为空的内容。

您还可以在阅读文件之前输入print来验证。

E.g:

editor = ['/path/to/sublime_text', '-w']

with tempfile.NamedTemporaryFile(delete=False) as f:
    f.close()
    if subprocess.call(editor + [f.name]) != 0:
        raise IOError()

    # read file…

答案 1 :(得分:0)

这是一个没有编辑器交互的解决方案,因为我没有足够的信息来模仿您的编辑器设置。

import tempfile

with tempfile.NamedTemporaryFile(delete=False) as f:
    f.close()
    with open(f.name, f.mode) as fnew:
        # Replace with editor interaction
        fnew.write('test')
        fnew.seek(0)
        for line in fnew.readlines():
            print line

至少在我的系统和版本(2.7.2)上,我必须进行这些更改以允许文件对象正确地重新打开并与之交互,并且它在Sublime中正确构建。 f.name是临时文件路径,f.mode是已经关闭的文件使用的模式(在这种情况下,它应该默认为'w + b')。