如何使用Python重命名文件


Answers:


578

用途os.rename

import os

os.rename('a.txt', 'b.kml')

52
应该注意的是,如果文件不在工作目录中,则需要完整路径。
EndermanAPM

在ubuntu 3.7上使用相对路径对我
不起作用

2
@toing_toing当然有效,他可能只是意味着您应该了解当前目录,并指定相对于其的路径,或者仅使用绝对路径(例如C:/folder/file.txt在Windows或/home/file.txtLinux / MacOS上)。
Alex P.19年

值得注意的是,这将在类似Unix的系统上以静默方式覆盖文件,但OSError在Windows系统上将失败。os.path.exists重命名之前,应使用该命令检查目标是否存在。这确实会造成“检查时间到使用时间”错误,但是不太可能引起问题。(我知道这周围没有简单的方法-看这里
AnnanFay

2
如果用户确实希望在任何操作系统上替换文件,则应使用os.replace
LucG

71

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

import os
old_file = os.path.join("directory", "a.txt")
new_file = os.path.join("directory", "b.kml")
os.rename(old_file, new_file)

48
import shutil

shutil.move('a.txt', 'b.kml')

这将可以重命名或移动文件。


31
shutil.move由于不是原子操作,因此不是一个好的选择。例如,如果文件打开,shutil.move将使用创建一个文件new_name,但不会删除该文件,old_name因此只剩下两个文件。os.rename另一方面,它什么也不会做,这是一个更好的选择。使用shutil.move,即使您捕获了错误,也仍然需要担心检查和删除恶意文件。当不值得一个更好的工具存在:os.rename
mvbentes

34

从Python 3.4开始,可以使用pathlib模块解决此问题。

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

假设您不在要重命名的根路径(只是给它增加了一点难度),而不必提供完整路径,我们可以看一下:

some_path = 'a/b/c/the_file.extension'

因此,您可以按照自己的路径创建一个Path对象:

from pathlib import Path
p = Path(some_path)

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

name_without_extension = p.stem

并仍将扩展名放在手边:

ext = p.suffix

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

Python 3.6及更高版本使用f字符串!

new_file_name = f"{name_without_extension}_1"

除此以外:

new_file_name = "{}_{}".format(name_without_extension, 1)

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

p.rename(Path(p.parent, new_file_name + ext))

更简短地展示其简单性:

Python 3.6及更高版本:

from pathlib import Path
p = Path(some_path)
p.rename(Path(p.parent, f"{p.stem}_1_{p.suffix}"))

低于Python 3.6的版本改用字符串格式方法:

from pathlib import Path
p = Path(some_path)
p.rename(Path(p.parent, "{}_{}_{}".format(p.stem, 1, p.suffix))

3
您为什么要这样做而不是接受答案?似乎复杂得多
rbennell

19
@rbennell,这个答案大部分是解释。答案实际上只是最后的三行。此外,为该名称更改明确做出了可接受的答案。此答案提供了一种方法,用于显示如何处理文件名以保留文件路径或名称中所需的部分。此外,该pathlib库是在python 3.4中引入的,因此在此处共享答案也可以提供一个可靠的模块,以展示其多功能性和对更复杂要求的用法。
idjaw

4
谢谢@idjaw,您的评论很好地回答了我们一个初学者的基本问题,一个简单的原因。。同样,令人耳目一新的是,互联网上的非敌对方法通常被认为是无知的。
Igor V.

3
@SasukeUchiha- {}用于字符串格式化,您可以在此处阅读。最终,发生的事情是将{}get替换为传递给format方法的变量。因此,第一个{}将保存其中的内容name_without_extension,第二个将保存第二个参数,即1
idjaw

3
使用f字符串可以进一步简化它。从pathlib导入路径p =路径(some_path)版本= 1 p.rename(路径(p.parent,f“ {p.stem} _ {version}” + p.suffix))
Liquidgenius


8

使用os.rename。但是您必须将两个文件的完整路径传递给函数。如果a.txt我的桌面上有文件,则可以这样做,而且我也必须提供完整的重命名文件。

 os.rename('C:\\Users\\Desktop\\a.txt', 'C:\\Users\\Desktop\\b.kml')

1
“必须”不是真的。您始终可以用相对文件名代替绝对文件名,反之亦然。通常,初学者很讨厌他们不了解相对文件名与当前工作目录的关系。
三人房

3
import os

# Set the path
path = 'a\\b\\c'  
# save current working directory
saved_cwd = os.getcwd()
# change your cwd to the directory which contains files
os.chdir(path)
os.rename('a.txt', 'b.klm')
# moving back to the directory you were in 
os.chdir(saved_cwd)

1
谨慎使用这种方式。您无法始终chdir()访问目录,例如,在Windows下使用UNC时会发生什么?而这样做chdir()有副作用。我宁愿仅指定os.rename()直接访问的必要路径,也不会chdir()
JonBrave

0

您可以使用os.system调用终端来完成任务:

os.system('mv oldfile newfile')

是的,这仅适用于基于UNIX的计算机,就像mv用于移动/重命名文件的UNIX内置命令行程序一样。
Mikhail Geyer

8
当可以以多平台方式从python调用终端时,为什么还要调用终端并定义仅UNIX的命令?
EndermanAPM

0
import os
import re
from pathlib import Path

for f in os.listdir(training_data_dir2):
  for file in os.listdir( training_data_dir2 + '/' + f):
    oldfile= Path(training_data_dir2 + '/' + f + '/' + file)
    newfile = Path(training_data_dir2 + '/' + f + '/' + file[49:])
    p=oldfile
    p.rename(newfile)

1
硬编码正斜杠作为路径分隔符,并将旧样式os.path与现代样式混合在一起pathlib非常困难。一路走下去pathlib
三人房

0
import shutil
import os

files = os.listdir("./pics/") 

for key in range(0, len(files)):
   print files[key]
   shutil.move("./pics/" + files[key],"./pics/img" + str(key) + ".jpeg")

这应该做。python 3+


...或将enumerate用作可读性更高的版本:对于密钥,enumerate(files)中的fname:…
Nicolas D
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.