Python os.link()vs.os.rename()vs.os.replace()用于编写原子写入文件。最好的方法是什么?
嗨,我正在写一个原子写函数,就像这样Python os.link()vs.os.rename()vs.os.replace()用于编写原子写入文件。最好的方法是什么?,python,Python,嗨,我正在写一个原子写函数,就像这样 with tempfile.NamedTemporaryFile(mode= "w", dir= target_directory) as f: #perform file writing operation os.replace(f.name, target_file_name) 我正在努力找出第3行中最好的行动。我应该使用os.replace()、os.rename()还是应该使用os.link()在tempfile和目标文
with tempfile.NamedTemporaryFile(mode= "w", dir= target_directory) as f:
#perform file writing operation
os.replace(f.name, target_file_name)
我正在努力找出第3行中最好的行动。我应该使用os.replace()、os.rename()还是应该使用os.link()在tempfile和目标文件之间创建硬链接
os.link()是否使用了更多内存?它们各自的好处是什么?它们都是原子的吗 我不确定你在这种情况下所说的“原子”是什么意思。但主要区别在于:
replace和rename是相似的,但是replace更跨平台(因此,我假设rename更好,如果您知道将使用哪个系统)
os.link将使用相同数量的磁盘空间,但您将创建一个硬链接,这可能不是您想要的。
os.rename
/os.replace
正在使用
唯一的区别是操作系统。replace
使用is_replace=1
,它对posix没有影响,但在windows上设置了标志:
如果存在名为lpNewFileName的文件,则函数将其内容替换为lpExistingFileName文件的内容,前提是满足有关访问控制列表(ACL)的安全要求。有关详细信息,请参阅本主题的备注部分
如果lpNewFileName或lpExistingFileName指定一个目录,并且lpExistingFileName存在,则会报告错误
os.link
不适用于此功能,除非您能保证目标文件不存在(因为os.link
将出错):
$touch a b
$link a b
链接:无法创建指向“a”的链接“b”:文件存在
$python3-c'导入操作系统;操作系统链接(“a”、“b”)'
回溯(最近一次呼叫最后一次):
文件“”,第1行,在
FileExistError:[Errno 17]文件存在:“a'->“b”
Atomic意味着有移动..原子。这意味着其他应用程序要么看到整个文件,要么什么也看不到,而可能是部分文件。这不仅是特定于平台的,还取决于底层的文件系统。我怀疑python会在这里给出任何硬保证。有些配置根本不允许原子移动(例如FAT32上的Windows,尽管我怀疑还有很多这样的说法)
$ touch a b
$ link a b
link: cannot create link 'b' to 'a': File exists
$ python3 -c 'import os; os.link("a", "b")'
Traceback (most recent call last):
File "<string>", line 1, in <module>
FileExistsError: [Errno 17] File exists: 'a' -> 'b'