你可以使用 Python 的tempfile
模块给你一个临时文件名。它可以以线程安全的方式创建一个临时文件,而不是使用time.time()
如果同时在多个线程中使用可能返回相同名称的临时文件。
正如对您问题的评论中所建议的那样,这可以与上下文管理器的使用相结合。tempfile.py
通过查看 Python源代码,您可以了解如何实现您想要做的事情。
下面的代码片段可能会做你想做的事。它使用从tempfile
.
- 临时文件的创建是线程安全的。
- 成功完成后重命名文件是原子的,至少在 Linux 上是这样。和之间没有单独的检查
os.path.exists()
,os.rename()
这可能会引入竞争条件。对于 Linux 上的原子重命名,源和目标必须位于同一文件系统上,这就是此代码将临时文件与目标文件放在同一目录中的原因。
- 对于大多数用途,
RenamedTemporaryFile
该类的行为应该像 a NamedTemporaryFile
,除非使用上下文管理器关闭它,文件被重命名。
样本:
import tempfile
import os
class RenamedTemporaryFile(object):
"""
A temporary file object which will be renamed to the specified
path on exit.
"""
def __init__(self, final_path, **kwargs):
tmpfile_dir = kwargs.pop('dir', None)
# Put temporary file in the same directory as the location for the
# final file so that an atomic move into place can occur.
if tmpfile_dir is None:
tmpfile_dir = os.path.dirname(final_path)
self.tmpfile = tempfile.NamedTemporaryFile(dir=tmpfile_dir, **kwargs)
self.final_path = final_path
def __getattr__(self, attr):
"""
Delegate attribute access to the underlying temporary file object.
"""
return getattr(self.tmpfile, attr)
def __enter__(self):
self.tmpfile.__enter__()
return self
def __exit__(self, exc_type, exc_val, exc_tb):
if exc_type is None:
self.tmpfile.delete = False
result = self.tmpfile.__exit__(exc_type, exc_val, exc_tb)
os.rename(self.tmpfile.name, self.final_path)
else:
result = self.tmpfile.__exit__(exc_type, exc_val, exc_tb)
return result
然后你可以像这样使用它:
with RenamedTemporaryFile('whatever') as f:
f.write('stuff')
在写入过程中,内容转到一个临时文件,退出时文件被重命名。这段代码可能需要一些调整,但总体思路应该可以帮助您入门。