在Os.Rename中强制覆盖

时间:2011-11-12 20:31:00

标签: python

是否可以强制重命名os.rename覆盖另一个文件(如果已存在)?例如,如果文件Tests.csv已经存在,则在下面的代码中,它将替换为Tests.txt文件(也被重命名为Tests.csv)。

os.rename("C:\Users\Test.txt","C:\Users\Tests.csv");

8 个答案:

答案 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")