在Os.Rename中强制覆盖

Spl*_*lin 55 python

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

os.rename("C:\Users\Test.txt","C:\Users\Tests.csv");
Run Code Online (Sandbox Code Playgroud)

atz*_*tzz 41

从Python 3.3开始,现在有一个标准的跨平台解决方案os.replace:

将文件或目录src重命名为dst.如果dst是目录,OSError则会引发.如果dst存在且是文件,则如果用户具有权限,则将以静默方式替换它.如果src和dst在不同的文件系统上,则操作可能会失败.如果成功,重命名将是原子操作(这是POSIX要求).

可用性:Unix,Windows.

版本3.3中的新功能.

但是,与文档相反,在Windows上,它并不保证是原子的(在Python 3.4.4中).那是因为它在Windows上内部使用MoveFileEx,这不能做出这样的保证.

  • @paulm如果你检查它的MSDN页面,它永远不会承诺原子性,甚至明确地建议`MoveFileTransacted`作为替代.实际上,`MoveFileEx`在本地文件系统上是原子的,但在网络文件系统上是非原子的(实际上它取决于服务器).但即使对于当地的FS,其原子性也是非契约性的. (2认同)

Ble*_*der 36

你可以尝试shutil.move():

from shutil import move

move('C:\\Users\\Test.txt', 'C:\\Users\\Tests.csv')
Run Code Online (Sandbox Code Playgroud)

或者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')
Run Code Online (Sandbox Code Playgroud)


650*_*502 9

正如文档所说,如果文件存在,则无法保证在Windows上进行原子重命名操作,因此Python所要求的是要求自己执行双步os.remove+ os.rename处理潜在错误.

在unix系统上rename,如果存在则覆盖目标(因为操作保证是原子的).

请注意,在Windows上,即使您具有权限,删除目标文件也可能会失败,因为该文件可能正在使用中.这是Windows文件系统的另一个基本限制,您必须自己在代码中处理它.


Ben*_*Ben 7

在Unix上,如果dst存在且是一个文件,如果用户有权限,它将被静默替换.如果src和dst在不同的文件系统上,则某些Unix风格的操作可能会失败.如果成功,重命名将是原子操作(这是POSIX要求).在Windows上,如果dst已经存在,即使它是文件,也会引发OSError; 当dst命名现有文件时,可能无法实现原子重命名. http://docs.python.org/library/os.html#os.rename

  • Windows应该从地球上消失的另一个原因 (7认同)

ell*_*kie 5

已接受答案的语法(对于 Python >= 3.3):

os.replace("src/file/path", "dst/file/path")
Run Code Online (Sandbox Code Playgroud)

(文档:os.replace