如何使用 Python 将临时文件持久保存到磁盘?
-
01-07-2019 - |
题
我正在尝试使用“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”库时这不是有意的吗?有一个更好的方法吗?(也许我忽略了一些非常微不足道的事情)
解决方案
您创建的文件 TemporaryFile
或者 NamedTemporaryFile
关闭时会自动删除,这就是您收到错误的原因。如果你不想要这个,你可以使用 mkstemp
相反(请参阅文档 临时文件).
>>> import tempfile, shutil, os
>>> fd, path = tempfile.mkstemp()
>>> os.write(fd, 'foo')
>>> os.close(fd)
>>> shutil.copy(path, 'bar.txt')
>>> os.remove(path)
其他提示
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[, 长度])
将类文件对象 fsrc 的内容复制到类文件对象 fdst 中。整数长度(如果给定)是缓冲区大小。特别地,负长度值意味着复制数据而不按块循环遍历源数据;默认情况下,数据以块的形式读取,以避免不受控制的内存消耗。注意,如果fsrc对象的当前文件位置不为0,则只会复制当前文件位置到文件末尾的内容。
从 python 2.6 开始你还可以使用 NamedTemporaryFile
与 delete=
选项设置为 False。这样,即使关闭临时文件,也可以访问它。
请注意,在 Windows(NT 及更高版本)上,当文件仍处于打开状态时,您无法再次访问该文件。您必须先关闭它,然后才能复制它。在 Unix 系统上情况并非如此。
你总是可以使用 Shutil.copyfileobj, ,在你的例子中:
new_file = open('bar.txt', 'rw')
shutil.copyfileobj(f, new_file)