我正在尝试使用“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 开始你还可以使用 NamedTemporaryFiledelete= 选项设置为 False。这样,即使关闭临时文件,也可以访问它。

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

你总是可以使用 Shutil.copyfileobj, ,在你的例子中:

new_file = open('bar.txt', 'rw')
shutil.copyfileobj(f, new_file)
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top