Python模块tempfile
包含NamedTemporaryFile
和TemporaryFile
。前者的文件说
该名称是否可用于再次打开文件,而命名的临时文件仍处于打开状态,因平台而异(可在Unix上使用;在Windows NT或更高版本上无法使用)
如果我不能使用该名称,该文件的名称有什么意义?如果我想在Windows上使用Unix的有用(对我来说)行为,我必须复制代码并删掉所有说if _os.name == 'nt'
之类的内容。
是什么给出的?当然这对于某些东西很有用,因为它是以这种方式刻意编码的,但这是什么东西?
答案 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)