我正在尝试使用tempfile模块。 (http://docs.python.org/2.7/library/tempfile.html) 我正在寻找一个临时文件,我可以打开几次以获得几个流来读取它。
tmp = ...
stream1 = # get a stream for the temp file
stream2 = # get another stream for the temp file
我已经尝试过几个函数(TemporaryFile,NamedTemporaryFile,SpooledTemporaryFile)并使用fileno方法,但我无法执行我想要的任务。
我是否应该自己上课?
由于
尝试使用其名称打开文件时出错...
In [2]: t = tempfile.NamedTemporaryFile()
In [3]: t.write('abcdef'*1000000)
In [4]: t.name
Out[4]: 'c:\\users\\mike\\appdata\\local\\temp\\tmpczggbt'
In [5]: f = open(t.name)
---------------------------------------------------------------------------
IOError Traceback (most recent call last)
<ipython-input-6-03b9332531d2> in <module>()
----> 1 f = open(t.name)
IOError: [Errno 13] Permission denied: 'c:\\users\\mike\\appdata\\local\\temp\\tmpczggbt'
答案 0 :(得分:8)
如果不将文件位置重新定位到开头,则无法多次读取文件对象(无论是临时的还是其他文件)。
您的选择是:
要重新打开该文件,请使用NamedTemporaryFile
并使用常规open()
调用重新打开相同的文件名几次。您可能希望将delete=False
传递给构造函数,尤其是在Windows上,以便能够执行此操作。
要快退,请在文件对象上调用.seek(0)
。
答案 1 :(得分:0)
您可以使用tempfile.mkstemp()
。来自文档:
以最安全的方式创建临时文件。假设平台正确实现os.open()的os.O_EXCL标志,文件创建中没有竞争条件。该文件只能由创建用户ID读写。如果平台使用权限位来指示文件是否可执行,则该文件可由任何人执行。子进程不会继承文件描述符。
与TemporaryFile()不同,mkstemp()的用户负责在完成后删除临时文件。
然后,您可以使用open()
内置函数多次创建和打开该文件。请记住在完成后删除文件,因为这不是自动完成的。