如何使用Python持久存储临时文件?

时间:2020-03-06 14:22:15  来源:igfitidea点击:

我正在尝试使用" 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"库时不打算这样做吗?有一个更好的方法吗? (也许我忽略了一些琐碎的事情)

解决方案

在示例中,我们始终可以使用shutil.copyfileobj:

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

我们使用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)

从python 2.6开始,我们还可以将NamedTemporaryFile使用,并将delete选项设置为False。这样,即使关闭临时文件,也可以访问它。

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