os.replace() 和 os.rename() 之间的区别?

问题描述 投票:0回答:3

我想使用 python 将文件从一个目录移动到 Linux 中的另一个目录。我希望实现类似于 bash

mv
命令的行为。

这两个命令在实践中有何区别

os.replace()
os.rename()

是否简单的是,如果目标中存在文件,

os.rename()
会引发错误,而
os.replace()
会覆盖它?

此外,如果我看到另一个次要区别,

os.replace()
需要一个文件作为目标,而不仅仅是目录。

我可以在任何地方找到直接答案。

python linux
3个回答
16
投票

在 POSIX 系统上,如果用户具有足够的权限,则 rename 系统调用将默默地替换目标文件。 在 Windows 上情况并非如此:始终会引发 FileExistsError。

os.replace
os.rename
在 POSIX 系统上是相同的函数,但在 Windows 上
os.replace
将调用
MoveFileExW
并设置
MOVEFILE_REPLACE_EXISTING
标志以提供与 POSIX 系统上相同的效果。

如果您想要一致的跨平台行为,您应该考虑在整个过程中使用

os.replace


6
投票

os.rename()

Python 中的

os.rename()
方法用于重命名文件或目录。 此方法将源文件/目录重命名为指定的目标文件/目录。

os.replace()

Python中的

os.replace()
方法也用于重命名文件或目录。

但是:

  • 如果目的地是目录,则会引发
    OSError
  • 如果目标存在并且是一个文件,它将被替换而不会出错 执行操作的用户是否有权限。
  • 如果源和目标位于不同的文件系统上,此方法可能会失败

1
投票

来自文档

os.replace()

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

os.rename()

将文件或目录 src 重命名为 dst。如果 dst 存在,则在许多情况下操作将失败并出现 OSError 子类: 在 Windows 上,如果 dst 存在,则始终引发 FileExistsError。 在 Unix 上,如果 src 是文件而 dst 是目录(反之亦然),将分别引发 IsADirectoryError 或 NotADirectoryError。如果两者都是目录并且 dst 为空,则 dst 将被静默替换。如果 dst 是非空目录,则会引发 OSError。如果两者都是文件,则如果用户有权限,它将被静默替换。如果 src 和 dst 位于不同的文件系统上,则该操作可能会在某些 Unix 版本上失败。如果成功,重命名将是一个原子操作(这是 POSIX 要求)。 此函数可以支持指定 src_dir_fd 和/或 dst_dir_fd 以提供相对于目录描述符的路径。

© www.soinside.com 2019 - 2024. All rights reserved.