YOU*_*YOU 509

用途os.rename:

import os

os.rename('a.txt', 'b.kml')
Run Code Online (Sandbox Code Playgroud)

  • 需要注意的是,如果文件不在工作目录中,则需要完整路径. (44认同)
  • 如果用户确实希望在任何操作系统上替换文件,则应该使用“os.replace” (5认同)
  • @toing_toing当然有效,他可能只是意味着你应该知道当前目录,或者指定相对于它的路径,或者只使用绝对路径(如Windows上的`C:/folder/file.txt`或 Linux/MacOS 上的 `/home/file.txt`)。 (3认同)
  • 不是真的,在 3.7 ubuntu 上,使用相对路径对我有用 (2认同)
  • 值得注意的是,这将在类 Unix 系统上默默地覆盖文件,但在 Windows 系统上会失败并出现“OSError”。`os.path.exists` 应该用于在重命名之前检查目标是否存在。这确实会产生“检查时间到使用时间”的错误,但不太可能导致问题。(我知道没有简单的方法解决这个问题 - 请参阅[此处](/sf/ask/225563901/)。 (2认同)
  • @AnnanFay 当尝试覆盖目标时,现在会引发 `FileExistsError` 而不是 `OSError`。查看[这个答案](/sf/answers/4811321301/)以按照@LucG的建议使用“os.replace” (2认同)

Abd*_*zak 58

文件可能在目录中,在这种情况下指定路径:

import os
old_file = os.path.join("directory", "a.txt")
new_file = os.path.join("directory", "b.kml")
os.rename(old_file, new_file)
Run Code Online (Sandbox Code Playgroud)


And*_*aam 47

import shutil

shutil.move('a.txt', 'b.kml')
Run Code Online (Sandbox Code Playgroud)

这将用于重命名或移动文件.

  • 由于不是原子操作,`shutil.move`不是一个好的选择.例如,如果文件是打开的,`shutil.move`将创建一个带有`new_name`的文件,但不会删除带有`old_name`的文件,因此会留下两个文件.另一方面,`os.rename`什么都不做,这是一个更好的选择*.使用`shutil.move`,即使您发现了错误,您仍然需要担心检查和删除恶意文件.当**存在更好的工具时,这是不值得的:`os.rename`**. (27认同)

idj*_*jaw 24

从Python 3.4开始,可以使用pathlib模块来解决这个问题.

如果您碰巧使用旧版本,则可以使用此处找到的反向移植版本

假设你不在根路径中(只是为了增加一点难度)你想要重命名,并且必须提供完整路径,我们可以看看这个:

some_path = 'a/b/c/the_file.extension'
Run Code Online (Sandbox Code Playgroud)

所以,你可以走你的路径并从中创建一个Path对象:

from pathlib import Path
p = Path(some_path)
Run Code Online (Sandbox Code Playgroud)

为了提供有关我们现在拥有的这个对象的一些信息,我们可以从中提取出一些东西.例如,如果出于某种原因,我们希望通过修改从文件名的文件重命名the_filethe_file_1,那么我们可以得到的文件名部分:

name_without_extension = p.stem
Run Code Online (Sandbox Code Playgroud)

并且仍然持有扩展:

ext = p.suffix
Run Code Online (Sandbox Code Playgroud)

我们可以通过简单的字符串操作来执行修改:

new_file_name = f"{name_without_extension}_1"
Run Code Online (Sandbox Code Playgroud)

现在我们可以通过调用rename我们创建的路径对象上的方法来执行重命名,并附ext加以完成我们想要的正确重命名结构:

new_file_name = "{}_{}".format(name_without_extension, 1)
Run Code Online (Sandbox Code Playgroud)

更短时间内展示其简洁性:

p.rename(Path(p.parent, new_file_name + ext))
Run Code Online (Sandbox Code Playgroud)

  • 那么@rbennell,这个答案的大部分都是一个解释.答案实际上只是最后的三条线.此外,接受的答案明确是为了更改名称.此答案提供了一种方法,用于说明如何操作文件名以在文件的路径或名称中保留所需的部分.此外,`pathlib`库是在python 3.4中引入的,因此在这里分享答案还为实体模块提供了曝光,以展示其多功能性和用于更复杂的需求. (13认同)
  • 谢谢你@idjaw,你的评论对我们初学者的一个基本问题是一个很好的答案,一个简单的_你为什么这样做?_.此外,在互联网上看到通常被认为是无知的非敌对态度令人耳目一新. (3认同)
  • @SasukeUchiha - `{}`用于字符串格式化,你可以阅读[这里](https://docs.python.org/3.7/library/string.html#format-examples).最终,正在发生的事情是`{}`被替换为传递给`format`方法的变量.所以第一个`{}`将保存`name_without_extension`中的内容,第二个将保存第二个参数,它只是`1`. (3认同)
  • 使用f字符串可进一步简化它。从pathlib导入路径p =路径(some_path)版本= 1 p.rename(路径(p.parent,f“ {p.stem} _ {version}” + p.suffix)) (3认同)
  • 为什么要这样做而不是接受的答案呢?似乎更复杂 (2认同)

Joe*_*Joe 17

os.rename(old, new)

这可以在Python文档中找到:http://docs.python.org/library/os.html


Chr*_*ett 15

从 Python 版本 3.3 及更高版本开始,通常首选使用os.replace代替,os.rename因此FileExistsError如果目标文件已存在,则不会引发此错误。

assert os.path.isfile('old.txt')
assert os.path.isfile('new.txt')

os.rename('old.txt', 'new.txt')
# Raises FileExistsError
os.replace('old.txt', 'new.txt')
# Does not raise exception

assert not os.path.isfile('old.txt')
assert os.path.isfile('new.txt')
Run Code Online (Sandbox Code Playgroud)

请参阅文档


lon*_*olf 7

使用os.rename.但是你必须将两个文件的完整路径传递给该函数.如果a.txt我的桌面上有一个文件,那么我会这样做,而且我也必须完全重命名文件.

 os.rename('C:\\Users\\Desktop\\a.txt', 'C:\\Users\\Desktop\\b.kml')
Run Code Online (Sandbox Code Playgroud)

  • “必须”是不正确的。您始终可以用相对文件名替换绝对文件名,反之亦然。通常困扰初学者的是他们不理解相对文件名与当前工作目录的关系。 (4认同)