Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/279.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python os.link()vs.os.rename()vs.os.replace()用于编写原子写入文件。最好的方法是什么?_Python - Fatal编程技术网

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'