下面的代码片段应该能够实现您的愿望。我写这篇文章的方式清楚地显示了正在做的事情,所以我相信可能会有一些调整,使它更高效或优雅。
import os
cwd = os.getcwd()
to_be_renamed = set()
for rootdir in next(os.walk(cwd))[1]:
if to_be_renamed == set():
to_be_renamed = set(next(os.walk(os.path.join(cwd, rootdir)))[1])
else:
to_be_renamed &= set(next(os.walk(os.path.join(cwd, rootdir)))[1])
for rootdir in next(os.walk(cwd))[1]:
subdirs = next(os.walk(os.path.join(cwd, rootdir)))[1]
for s in subdirs:
if s in to_be_renamed:
srcpath = os.path.join(cwd, rootdir, s)
dstpath = os.path.join(cwd, rootdir, rootdir+'_'+s)
# First rename files
for f in next(os.walk(srcpath))[2]:
os.rename(os.path.join(srcpath, f), os.path.join(srcpath, rootdir+'_'+f))
# Now rename dir
os.rename(srcpath, dstpath)
print('Renamed', s, 'and files')
cwd
存储指向包含DIR1、DIR2和DIR3的目录的路径。第一个循环检查这些“根目录”的所有直接子目录,并通过重复获取它们的交集来创建一组重复的子目录名称(
&
然后运行另一个循环,检查子目录是否要重命名,最后使用
os.rename
函数重命名它及其包含的所有文件。
os.walk()
在每一步返回一个3元组,其中包含目录的路径、目录中的目录以及目录中的文件。它以自上而下或自下而上的方式“遍历”树,并且不会在一次迭代中停止。
所以,内置的
next()
[1]
或
[2]
如果不仅要重命名文件,还要重命名要重命名的子目录中的所有项,请替换
next(os.walk(srcpath))[2]
os.listdir(srcpath)
. 此列表包含文件和目录。
注: