您可以使用Python的
tempfile模块为您提供一个临时文件名。它可以以线程安全的方式创建一个临时文件,而不是使用一个临时文件(
time.time()如果同时在多个线程中使用该文件可能返回相同的名称)。
正如对您的问题的评论中所建议的那样,这可以与上下文管理器一起使用。通过查看Python
tempfile.py源代码,您可以得到一些有关如何实现想要执行的 *** 作的想法。
下面的代码段可能会做您想要的。它使用从返回的对象的某些内部
tempfile。
- 创建临时文件是线程安全的。
- 成功完成文件重命名是原子的,至少在Linux上是如此。没有之间的单独检查
os.path.exists()
和os.rename()
可能引入竞争状态。对于Linux上的原子重命名,源和目标必须位于同一文件系统上,这就是为什么此代码将临时文件与目标文件放置在同一目录中的原因。 - 在大多数情况下,
RenamedTemporaryFile
该类的行为应类似于aNamedTemporaryFile
,除非使用上下文管理器关闭该类时,文件会重命名。
样品:
import tempfileimport osclass 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')
在写入过程中,内容进入一个临时文件,退出时该文件被重命名。这段代码可能需要进行一些调整,但是总体思路应该可以帮助您入门。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)