5

我已经成功地找到了生成 vim 编辑器并从 python 脚本创建临时文件的代码。代码在这里,我在这里找到了:call up an EDITOR (vim) from a python script

import sys, tempfile, os
from subprocess import call

EDITOR = os.environ.get('EDITOR','vim') 

initial_message = "" 

with tempfile.NamedTemporaryFile(suffix=".tmp") as tempfile:
  tempfile.write(initial_message)
  tempfile.flush()
  call([EDITOR, tempfile.name])

我遇到的问题是退出编辑器后无法访问临时文件的内容。

tempfile
<closed file '<fdopen>', mode 'w+b' at 0x87c47b0>

tempfile.readline()

我明白了

ValueError: I/O operation on closed file

我做了:

myfile = open(tempfile.name)
IOError: [Errno 2] No such file or directory: '/tmp/tmp7VKzfl.tmp'

使用编辑器编辑文件后,如何在 python 脚本中访问该文件?

谢谢

4

3 回答 3

5

块内的所有内容都是with有范围的。如果使用with语句创建临时文件,则在块结束后它将不可用。

您需要读取with块内的临时文件内容,或使用另一种语法来创建临时文件,例如:

tempfile = NamedTemporaryFile(suffix=".tmp")
# do stuff
tempfile.close()

如果您确实想在块之后自动关闭文件,但仍然能够重新打开它,请传递delete=FalseNamedTemporaryFile构造函数(否则它将在关闭后被删除):

with tempfile.NamedTemporaryFile(suffix=".tmp", delete=False) as tempfile:

顺便说一句,您可能想使用特使来运行子进程,不错的库:)

于 2012-04-11T09:38:35.900 回答
3

我遇到了同样的问题并且有同样的问题。

只是不删除临时文件以便读取它,这感觉不是最佳实践。我找到了以下方法来读取 vim 编辑后写入 NamedTempFile 实例的内容,读取它,并保留删除临时文件的优势。(如果不是自己删掉就不是暂时的吧?!)

必须倒回临时文件然后读取它。我在以下位置找到了答案: http: //pymotw.com/2/tempfile/

import os
import tempfile
from subprocess import call

temp = tempfile.TemporaryFile()
try:
    temp.write('Some data')
    temp.seek(0)

    print temp.read()
finally:
    temp.close()

这是我在脚本中使用的实际代码: import tempfile import os from subprocess import call

EDITOR = os.environ.get('EDITOR', 'vim')
initial_message = "Please edit the file:"

with tempfile.NamedTemporaryFile(suffix=".tmp") as tmp:
    tmp.write(initial_message)
    tmp.flush()
    call([EDITOR, tmp.name])
    #file editing in vim happens here
    #file saved, vim closes
    #do the parsing with `tempfile` using regular File operations
    tmp.seek(0)
    print tmp.read()
于 2013-11-07T15:03:56.640 回答
2

NamedTemporaryFile创建一个文件,该文件在关闭后被删除(docs)。因此,它不适合当您需要向临时文件写入内容并在文件关闭后读取内容时。

改为使用mkstemp文档):

f, fname = mkstemp(suffix=".tmp")
f.write("...")
f.close()
call([EDITOR, fname])
于 2012-04-11T09:42:53.917 回答