是否可以强制重命名os.rename覆盖另一个文件(如果已存在)?例如,如果文件Tests.csv已经存在,则在下面的代码中,它将替换为Tests.txt文件(也被重命名为Tests.csv)。
os.rename("C:\Users\Test.txt","C:\Users\Tests.csv");
答案 0 :(得分:30)
自Python 3.3以来,现在有一个标准的跨平台解决方案os.replace
:
重命名 文件或目录src到dst。如果dst是目录,
OSError
将是 提高。 如果dst存在且是文件,则会以静默方式替换它 用户有权限。如果src和dst打开,则操作可能会失败 不同的文件系统。如果成功,重命名将是原子的 操作(这是POSIX要求)。可用性:Unix,Windows。
版本3.3中的新功能。
然而,与文档相反,在Windows上,它不能保证是原子的(在Python 3.4.4中)。这是因为internally它在Windows上使用了MoveFileEx
,而这并没有做出这样的保证。
答案 1 :(得分:29)
您可以尝试shutil.move()
:
from shutil import move
move('C:\\Users\\Test.txt', 'C:\\Users\\Tests.csv')
或os.remove
然后shutil.move
:
from os import remove
from shutil import move
remove('C:\\Users\\Tests.csv')
move('C:\\Users\\Test.txt', 'C:\\Users\\Tests.csv')
答案 2 :(得分:9)
正如documentation所说,如果文件存在,则无法保证Windows上的原子重命名操作,因此Python要求自己执行双步os.remove
+ os.rename
,处理潜在的错误。
在unix系统上rename
会覆盖目标(如果存在)(因为操作保证是原子的)。
请注意,在Windows上,即使您具有权限,删除目标文件也可能会失败,因为该文件可能正在使用中。这是Windows文件系统的另一个基本限制,您必须自己在代码中处理它。
答案 3 :(得分:7)
在Unix上,如果dst存在且是一个文件,如果用户有权限,它将被静默替换。如果src和dst在不同的文件系统上,则某些Unix风格的操作可能会失败。如果成功,重命名将是原子操作(这是POSIX要求)。 在Windows上,如果dst已经存在,即使它是文件,也会引发OSError;当dst命名现有文件时,可能无法实现原子重命名。 http://docs.python.org/library/os.html#os.rename
答案 4 :(得分:2)
有趣的是,os.rename()
的文档说它确实取代了Unix系统上的目标,但在Windows上则没有。如果目标存在于Windows上,他们提到一些模糊的关于无法实现原子重命名的事情,IMO几乎不足以支持它。
你应该捕获OSError(Windows上存在目标)并删除目标,然后重试,我想。
答案 5 :(得分:1)
如何使用replace()和shutil.move()? 例如:
import os
from shutil import move
filename=r'C:\Users\Test.txt'
move(filename,filename.replace('.txt','.csv')
还可以使所有文件更通用。 谢谢
答案 6 :(得分:0)
在标准库文档中,“在Windows上,如果dst已经存在,即使它是文件,也会引发OSError;当dst命名现有文件时,可能无法实现原子重命名。“
http://docs.python.org/library/os.html#os.rename
不幸的是,唯一的解决方案是改变操作系统; Windows根本不允许现有文件上的rename()
。
答案 7 :(得分:0)
import os
try:
os.rename("/path/input file", "/path/output file")
except FileExistsError:
os.remove("/path/output file")
os.rename("/path/input file", "/path/output file")