如何使用Python将临时文件持久化到磁盘?
我正在尝试使用'tempfile'模块来处理和创建文本文件。当文件准备好后,我想把它保存到硬盘上。我以为只需要用'shutil.copy'就能做到,但却遇到了一个'权限被拒绝'的IO错误:
>>> 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 个回答
从 Python 2.6 开始,你可以使用 NamedTemporaryFile
这个功能,并把 delete=
选项设置为 False。这样一来,即使你关闭了临时文件,它仍然可以被访问。
需要注意的是,在 Windows 系统(NT 及以后的版本)上,如果文件还没有关闭,你不能第二次访问它。你必须先关闭文件,才能复制它。而在 Unix 系统上,这种限制就不存在了。
hop说得对,而dF的解释不太正确,关于错误发生的原因。
因为你还没有调用 f.close()
,所以这个文件并没有被删除。
NamedTemporaryFile的文档里提到:
在命名的临时文件仍然打开的时候,是否可以用这个名字再次打开文件,因平台而异(在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
。如果给定了整数length
,则表示缓冲区的大小。特别地,负值的length
表示不分块地复制数据;默认情况下,数据是分块读取的,以避免不受控制的内存消耗。注意,如果fsrc
对象的当前文件位置不是0,那么只会复制从当前文件位置到文件末尾的内容。
你用 TemporaryFile
或 NamedTemporaryFile
创建的文件在关闭时会自动被删除,这就是你遇到错误的原因。如果你不想让文件自动删除,可以使用 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)