永久使用 Python 个临时文件

Using Python tempfiles permanently

我目前正在稍微滥用 tempfile,使用它为 永久 文件生成唯一名称。我正在使用以下函数来获取唯一 ID:

def gen_id():
    tf = tempfile.mktemp()
    tfname = os.path.split(tf)[1]
    return tfname.strip(tempfile.gettempprefix())

然后我使用该函数的文件名将文件存储在自定义目录中。我使用这个函数比内置函数更灵活;使用此功能,我可以选择自己的目录并删除 tmp 前缀。

因为 tempfiles 应该是 "temporary files," 将它们的唯一性用于像这样的永久文件有什么危险吗?我的函数无法安全生成唯一 ID 的任何原因?

编辑: 我想到了使用 tempfile 来自 this SO answer.

的唯一名称

help(tempfile.mktemp) -> "这个函数是不安全的,不应该被使用。文件名指的是一个在某个时候不存在的文件,但是当你绕过的时候要创建它,其他人可能先发制人。"

即您可以从中获取与现有文件同名的文件名。

替代品是 tempfile.mkstemp(),它实际上确实创建了一个文件,您通常必须在使用后将其删除...但是您可以为它提供一个参数以指定您的自定义目录所在的位置并告诉它使用 no前缀,并让它为您创建文件。它将检查同名的现有文件并创建新名称,直到找到未使用的名称。

tempfile.mkstemp(suffix="", prefix=template, dir=None, text=False)

(tempfile模块是写在Python里的,你可以在\Lib\tempfile.py中看到它的代码)

我强烈建议只使用来自相同答案的 this comment 作为生成唯一名称的方式。

无需为此滥用 mktemp(而且它已被弃用)。

请记住使用 mktemp 保证文件名在调用期间不存在,但如果您删除了所有临时文件和缓存,或者甚至在调用后立即删除相同的文件(或者 mktemp同一个路径)可以创建两次。

在这种情况下使用随机选择导致碰撞的可能性较小并且没有缺点。但是,您应该检查发生碰撞的可能性很小,在这种情况下您应该生成一个新名称。