我试图使用'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'库时?有一个更好的方法吗?(也许我忽略了一些非常微不足道的事情)
跳是正确的,和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,则仅复制从当前文件位置到文件末尾的内容.
您创建的文件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)
从蟒蛇2.6开始,你也可以使用NamedTemporaryFile
与delete=
设置为False选项.这样,即使关闭临时文件,也可以访问临时文件.
请注意,在Windows(NT和更高版本)上,您仍然无法在文件仍处于打开状态时再次访问该文件.您必须先关闭它才能复制它.在Unix系统上不是这样.
您可以在示例中始终使用shutil.copyfileobj:
new_file = open('bar.txt', 'rw') shutil.copyfileobj(f, new_file)