Python 什么名称的临时文件在Windows上有用?
Python模块Python 什么名称的临时文件在Windows上有用?,python,windows,Python,Windows,Python模块tempfile包含NamedTemporaryFile和TemporaryFile。前者的文件说 在命名的临时文件仍处于打开状态时,该名称是否可用于第二次打开该文件因平台而异(在Unix上可以使用该名称;在Windows NT或更高版本上不能使用该名称) 如果我不能使用文件名,文件名有什么意义?如果我想在Windows上使用Unix的有用(对我来说)行为,我必须复制一份代码,并删除所有表示If\u os.name==“nt”等的位 有什么好处?当然,这对某些东西是有用的,因为它
tempfile
包含NamedTemporaryFile
和TemporaryFile
。前者的文件说
在命名的临时文件仍处于打开状态时,该名称是否可用于第二次打开该文件因平台而异(在Unix上可以使用该名称;在Windows NT或更高版本上不能使用该名称)
如果我不能使用文件名,文件名有什么意义?如果我想在Windows上使用Unix的有用(对我来说)行为,我必须复制一份代码,并删除所有表示If\u os.name==“nt”
等的位
有什么好处?当然,这对某些东西是有用的,因为它是故意以这种方式编码的,但那是什么东西呢?你不想“把所有的比特都撕掉…”。这样编码是有原因的。上面说你不能在它还开着的时候再打开它。不要。只需使用一次,然后扔掉它(毕竟,它是一个临时文件)。如果您想要一个永久文件,请创建自己的文件
“这肯定对某些东西有用,因为它是故意以这种方式编码的,但那是什么东西呢?”。嗯,我用它来写电子邮件(以二进制格式),然后将它们复制到我们的Exchange服务器接收并发送它们的位置。我确信还有很多其他的用例。它声明在它仍然打开时再次访问它。您仍然可以使用该名称,只需确保在创建
NamedTemporaryFile
时传递delete=False,以便它在关闭后仍然存在。我很确定Python库编写者并不是为了取笑而决定让NamedTemporaryFile
在Windows上表现不同。由于Windows和Unix之间的平台差异,所有这些\u os.name==“nt”
测试都将在那里进行。因此,我从该文档中推断出,在Windows上,以NamedTemporaryFile
打开方式打开的文件不能再次打开,而NamedTemporaryFile
仍处于打开状态,这是由于Windows的工作方式造成的。我使用这个:,在所有平台上工作,您可以关闭它,再次打开它,等等
功能mode=None
是您想要的,您可以请求一个tempfile,指定mode=None
,这将为您提供一个UUID样式的temp名称,其中包含您想要的dir/后缀/前缀。链接引用显示使用情况的测试
它基本上与NamedTemporaryFile相同,只是当返回的对象被垃圾收集时,该文件将被自动删除。。。不是很近
class TemporaryFile:
def __init__(self, name, io, delete):
self.name = name
self.__io = io
self.__delete = delete
def __getattr__(self, k):
return getattr(self.__io, k)
def __del__(self):
if self.__delete:
try:
os.unlink(self.name)
except FileNotFoundError:
pass
def NamedTemporaryFile(mode='w+b', bufsize=-1, suffix='', prefix='tmp', dir=None, delete=True):
if not dir:
dir = tempfile.gettempdir()
name = os.path.join(dir, prefix + os.urandom(32).hex() + suffix)
if mode is None:
return TemporaryFile(name, None, delete)
fh = open(name, "w+b", bufsize)
if mode != "w+b":
fh.close()
fh = open(name, mode)
return TemporaryFile(name, fh, delete)
但该用例也被非Windows行为所满足。。。基本上,您可以在Windows上执行所有操作,并在文件打开时重新打开该文件。这意味着可以使用delete=True
进行清理。所以我想不是没用,只是没那么有用。它可以,只是用open(“rbD”)来重新打开它,而不是open(“rb”)。有关fopen()
标志,请参阅mscvrt文档。