目录中文件的批量重命名
有没有简单的方法可以用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
这种重命名其实很简单,比如可以用 os 和 glob 这两个模块来实现:
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
是文件原来的名字(不包括扩展名)。