什么是NamedTemporaryFile在Windows上有用?

时间:2011-06-20 20:03:55

标签: python windows

Python模块tempfile包含NamedTemporaryFileTemporaryFile。前者的文件说

  

该名称是否可用于再次打开文件,而命名的临时文件仍处于打开状态,因平台而异(可在Unix上使用;在Windows NT或更高版本上无法使用)

如果我不能使用该名称,该文件的名称有什么意义?如果我想在Windows上使用Unix的有用(对我来说)行为,我必须复制代码并删掉所有说if _os.name == 'nt'之类的内容。

是什么给出的?当然这对于某些东西很有用,因为它是以这种方式刻意编码的,但这是什么东西?

4 个答案:

答案 0 :(得分:8)

它表示在打开时第二次访问它。您仍然可以使用其他名称,只需确保在创建delete=False时通过NamedTemporaryFile,以便在关闭后仍然存在。

答案 1 :(得分:1)

你不想“撕掉所有的东西......”。出于某种原因,它的编码就是这样的。它说你不能在第二次打开时打开它。别。只需使用一次,扔掉它(毕竟,它是一个临时文件)。如果您想要永久文件,请创建自己的文件。

“当然这对某些东西很有用,因为它是故意用这种方式编码的,但那是什么东西”。好吧,我已经用它来编写电子邮件(以二进制格式),然后再将它们复制到我们的Exchange Server选择它们的位置。发送它们。我确信还有很多其他用例。

答案 2 :(得分:0)

我很确定Python库编写者不仅仅决定让NamedTemporaryFile在Windows上表现得与众不同。由于Windows和Unix之间的平台差异,所有这些_os.name == 'nt'测试都将在那里。因此,我对该文档的推断是,在Windows上,文件以NamedTemporaryFile打开的方式打开,无法再次打开,而NamedTemporaryFile仍然打开它,这是由于 Windows 的工作方式。

答案 3 :(得分:0)

我使用以下命令:https://gist.github.com/earonesty/a052ce176e99d5a659472d0dab6ea361,可在所有平台上使用,您可以将其关闭,再次打开等。

功能mode=None是您想要的,您可以要求一个临时文件,指定mode=None,这将为您提供UUID样式的临时名称,并带有所需的目录/后缀/前缀。链接引用了显示用法的测试。

与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)