我目前正在通过使用它为永久文件生成唯一名称来稍微滥用tempfile
。我使用以下函数获取唯一ID:
def gen_id():
tf = tempfile.mktemp()
tfname = os.path.split(tf)[1]
return tfname.strip(tempfile.gettempprefix())
然后我将文件存储在具有该函数文件名的自定义目录中。我使用这个函数给了我比内置函数更多的灵活性;使用此功能,我可以选择自己的目录并删除tmp
前缀。
由于tempfile
应该是"临时文件,"对于像这样的永久文件使用它们的唯一性有什么危险吗?为什么我的函数不能安全地生成唯一ID?
编辑:我有权使用tempfile
来获取this SO answer中的唯一名称。
答案 0 :(得分:2)
help(tempfile.mktemp)
- > “此功能不安全,不应使用。文件名是指某个时刻不存在的文件,但是当你开始创建它时,其他人可能会打败你。 “
即。您可以从中获取与现有文件同名的文件名。
替换是tempfile.mkstemp()
并且它实际上创建了一个文件,您通常必须在使用后删除它...但是您可以为自定义目录所在的位置指定一个参数并告诉它不使用前缀,并让它为您创建完整的文件。它将检查相同名称的现有文件并创建新名称,直到找到未使用的名称。
tempfile.mkstemp(suffix="", prefix=template, dir=None, text=False)
(tempfile模块是用Python编写的,你可以在\ Lib \ tempfile.py中看到它的代码)
答案 1 :(得分:0)
我强烈建议您使用与生成唯一名称相同答案的this comment。
无需滥用mktemp
(无论如何它已被弃用)。
请记住,使用mktemp可以保证在调用过程中不存在文件名,但是如果删除了所有临时文件和缓存,或者甚至在调用后立即删除了相同的文件(或者{{1}可以创建两次相同的路径。
使用随机选择在这种情况下导致碰撞的可能性较小,并且没有缺点。但是,您应该检查发生碰撞的可能性很小,在这种情况下,您应该生成一个新名称。