如何在Python中读取NamedTemporaryFile?

9

我刚开始学习Python2.6编程,我的目标是在操作系统的临时目录中创建 .txt 或 .xls 的 "临时文件",并向其中写入一些数据。然后从 "临时文件" 中读取数据,在读取完数据后,将 "临时文件" 从临时目录中删除。

为了完成这个过程,我选择了 NamedTemporaryFile(),但无法实现。请问您有什么建议吗?提前感谢您的帮助。

>>> import os
>>> import tempfile
>>> with tempfile.NamedTemporaryFile() as temp:
            print temp.name
            temp.write('Some data')            
            f = open(os.path.join(tempfile.gettempdir(),temp.name))
            lines = f.readlines()
            f.close()
            temp.flush()


c:\users\110\appdata\local\temp\tmpf8p3kc

Traceback (most recent call last):
  File "<pyshell#3>", line 4, in <module>
    f = open(os.path.join(tempfile.gettempdir(),temp.name))
IOError: [Errno 13] Permission denied: 'c:\\users\\110\\appdata\\local\\temp\\tmpf8p3kc'
3个回答

13

我的做法是使用file = tempfile.NamedTemporaryFile(..., delete=False)创建一个临时文件,在完成写入操作后手动关闭该文件,并在完成操作后手动调用os.remove(file.name)来删除该文件。(你可以在自定义上下文管理器__exit__方法中执行文件删除操作,以便更方便地使用with)。


2
如果设置delete=False,使用NamedTemporaryFile的好处是什么? - Matt-Heun Hong
2
@MattIanHong 使用NamedTemporaryFile的其他好处不仅限于自动删除。默认情况下,它将被放置在临时目录中,并且文件名会自动生成以避免与现有文件冲突和竞争条件。 - jamesdlin

3

我曾经遇到过这个问题。

根据文档说明:“当临时文件仍处于打开状态时,是否可以使用名称再次打开文件取决于不同的平台(在Unix上可以这样用;而在Windows NT或更高版本中不能这样用)。”

为什么不尝试在文件仍然打开时使用temp对象来读取文件?如果使用w+b模式打开,则应该能够进行seek()和read()操作。


3
一般情况下,“仅尝试从文件中读取”可能并不总是可行的。在我遇到这个问题的情况下,我正在写入一个临时文件,稍后将该文件提供给另一个程序,而那个程序(我无法控制)希望能够打开指定的文件。 - jamesdlin

-1

我创建了一种替代机制,它创建一个命名的临时文件,但不保持其打开状态。因此,它可以在任何地方完全使用。它不是在关闭时删除,而是在 with 块结束时删除。

安装 shelljob pip 包。从 docs 中查看示例用法:

with fs.NamedTempFile() as nm:
    proc.call( "curl http://mortoray.com/ -o {}".format( nm ) )
    html = open(nm).read()
    print( len(html) )

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接