Python 什么名称的临时文件在Windows上有用?

Python 什么名称的临时文件在Windows上有用?,python,windows,Python,Windows,Python模块tempfile包含NamedTemporaryFile和TemporaryFile。前者的文件说 在命名的临时文件仍处于打开状态时,该名称是否可用于第二次打开该文件因平台而异(在Unix上可以使用该名称;在Windows NT或更高版本上不能使用该名称) 如果我不能使用文件名,文件名有什么意义?如果我想在Windows上使用Unix的有用(对我来说)行为,我必须复制一份代码,并删除所有表示If\u os.name==“nt”等的位 有什么好处?当然,这对某些东西是有用的,因为它

Python模块
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文档。