当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《如何使用Python持久化磁盘临时文件?》经验,为你挑选了4个好方法。

我试图使用'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 "", line 1, in 
    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'库时?有一个更好的方法吗?(也许我忽略了一些非常微不足道的事情)



1> K Z..:

跳是正确的,和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.如果给定,则整数长度是缓冲区大小.特别地,负长度值意味着复制数据而不以块的形式循环源数据; 默认情况下,数据以块的形式读取,以避免不受控制的内存消耗.请注意,如果fsrc对象的当前文件位置不为0,则仅复制从当前文件位置到文件末尾的内容.


@KayZhu除了没有`delete = False`,`shutil.copy`将无法工作,导致原始`IOError`启动此线程!所以在这种情况下我同意@jedierikb,你需要`os.remove`.

2> dF...:

您创建的文件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)


Kay Z在下面有正确的答案.此外,他/她更好地解释了它.
我认为错误来自于这样一个事实:当它仍处于打开状态时,您无法再次访问该文件(根据文档,这仅限于Windows)

3> 小智..:

从蟒蛇2.6开始,你也可以使用NamedTemporaryFiledelete=设置为False选项.这样,即使关闭临时文件,也可以访问临时文件.

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



4> Hans Sjunnes..:

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

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

推荐阅读
惬听风吟jyy_802
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有