目录中文件的批量重命名

107 投票
14 回答
185330 浏览
提问于 2025-04-11 09:35

有没有简单的方法可以用Python来重命名一个文件夹里的多个文件呢?

举个例子:我有一个文件夹,里面全是*.doc的文件,我想把它们统一重命名。

X.doc -> "new(X).doc"

Y.doc -> "new(Y).doc"

14 个回答

24

如果你不介意使用正则表达式,那么这个函数可以让你在重命名文件时拥有很大的灵活性:

import re, glob, os

def renamer(files, pattern, replacement):
    for pathname in glob.glob(files):
        basename= os.path.basename(pathname)
        new_filename= re.sub(pattern, replacement, basename)
        if new_filename != basename:
            os.rename(
              pathname,
              os.path.join(os.path.dirname(pathname), new_filename))

在你的例子中,你可以这样做(假设你是在文件所在的当前目录):

renamer("*.doc", r"^(.*)\.doc$", r"new(\1).doc")

不过你也可以把文件名恢复到最初的样子:

renamer("*.doc", r"^new\((.*)\)\.doc", r"\1.doc")

还有更多其他的功能。

142

我更喜欢为每个需要替换的内容写简单的一行代码,而不是写复杂的通用代码。例如:

这段代码会把当前目录下所有非隐藏文件中的下划线替换成连字符。

import os
[os.rename(f, f.replace('_', '-')) for f in os.listdir('.') if not f.startswith('.')]
118

这种重命名其实很简单,比如可以用 osglob 这两个模块来实现:

import glob, os

def rename(dir, pattern, titlePattern):
    for pathAndFilename in glob.iglob(os.path.join(dir, pattern)):
        title, ext = os.path.splitext(os.path.basename(pathAndFilename))
        os.rename(pathAndFilename, 
                  os.path.join(dir, titlePattern % title + ext))

然后你可以在你的例子中这样使用:

rename(r'c:\temp\xx', r'*.doc', r'new(%s)')

上面的例子会把 c:\temp\xx 文件夹里的所有 *.doc 文件重命名为 new(%s).doc,其中 %s 是文件原来的名字(不包括扩展名)。

撰写回答