如何使用Python持久化磁盘临时文件?

时间:2008-09-18 16:27:27

标签: python temporary-files

我正在尝试使用'tempfile'模块来操作和创建文本文件。文件准备好后,我想将其保存到磁盘。我认为这就像使用'shutil.copy'一样简单。但是,我得到'权限被拒绝'IOError:

>>> import tempfile, shutil
>>> f = tempfile.TemporaryFile(mode ='w+t')
>>> f.write('foo')
>>> shutil.copy(f.name, 'bar.txt')

Traceback (most recent call last):
  File "<pyshell#5>", line 1, in <module>
    shutil.copy(f.name, 'bar.txt')
  File "C:\Python25\lib\shutil.py", line 80, in copy
    copyfile(src, dst)
  File "C:\Python25\lib\shutil.py", line 46, in copyfile
    fsrc = open(src, 'rb')
IOError: [Errno 13] Permission denied: 'c:\\docume~1\\me\\locals~1\\temp\\tmpvqq3go'
>>> 

使用'tempfile'库时这不是意图吗?有一个更好的方法吗? (也许我忽略了一些非常微不足道的事情)

4 个答案:

答案 0 :(得分:37)

跳是正确的,而且是dF。错误发生的原因不正确。

由于您尚未调用f.close(),因此文件已删除。

NamedTemporaryFile的{​​{3}}说:

  

这个名称是否可以用来第二次打开文件,而命名的临时文件仍然是打开的,因此不同平台(它可以在Unix上使用;它不能在Windows NT或更高版本上使用)。

对于TemporaryFile

  

在Unix下,文件的目录条目会在创建文件后立即删除。其他平台不支持此功能;您的代码不应该依赖于使用此函数创建的临时文件,该文件在文件系统中具有或不具有可见名称。

因此,要保留临时文件(在Windows上),您可以执行以下操作:

import tempfile, shutil
f = tempfile.NamedTemporaryFile(mode='w+t', delete=False)
f.write('foo')
file_name = f.name
f.close()
shutil.copy(file_name, 'bar.txt')
os.remove(file_name)

Hans Sjunnesson提供的解决方案也是关闭的,因为copyfileobj仅从类文件对象复制到类文件对象,而不是文件名:

  

shutil.copyfileobj(fsrc,fdst [,length])

     
    

将类文件对象fsrc的内容复制到类文件对象fdst。如果给定,则整数长度是缓冲区大小。特别是,负长度值意味着复制数据而不以块的形式循环源数据;默认情况下,数据以块的形式读取,以避免不受控制的内存消耗。请注意,如果fsrc对象的当前文件位置不为0,则仅复制从当前文件位置到文件末尾的内容。

  

答案 1 :(得分:19)

您使用TemporaryFileNamedTemporaryFile创建的文件会在关闭时自动删除,这就是您收到错误的原因。如果您不想这样做,可以改为使用mkstemp(请参阅tempfile的文档)。

>>> import tempfile, shutil, os
>>> fd, path = tempfile.mkstemp()
>>> os.write(fd, 'foo')
>>> os.close(fd)
>>> shutil.copy(path, 'bar.txt')
>>> os.remove(path)

答案 2 :(得分:12)

从python 2.6开始,您也可以使用NamedTemporaryFile选项设置为False的delete=。这样,即使关闭临时文件,也可以访问临时文件。

请注意,在Windows(NT及更高版本)上,当文件仍处于打开状态时,您无法再次访问该文件。您必须先关闭它才能复制它。在Unix系统上不是这样。

答案 3 :(得分:5)

您可以在示例中始终使用 shutil.copyfileobj

new_file = open('bar.txt', 'rw')
shutil.copyfileobj(f, new_file)