我具有如下所示的文件夹结构
有几个具有重复名称的子文件夹,我想要做的就是遇到任何重复的子文件夹名称时,都应该在其父文件夹名称之前加上前缀。
例如 DIR2> SUBDIR1 应该重命名为 DIR2> DIR2_SUDIR1 ,当该文件夹重命名为DIR2_SUDIR1时,该文件夹中的文件应具有与父文件夹相同的前缀。 例如。 DIR2> SUBDIR1> subdirtst2.txt 现在应成为 DIR2> DIR2_SUDIR1> DIR2_subdirtst2.txt
到目前为止我做了什么?
我只是将所有文件夹名称添加到列表中,此后,我将找不到解决此问题的任何优雅方法。
import os
list_dir=[]
for root, dirs, files in os.walk(os.getcwd()):
for file in files:
if file.endswith(".txt"):
path_file = os.path.join(root)
print(path_file)
list_dir.append(path_file)
答案 0 :(得分:1)
以下代码段应该能够实现您想要的。我写的方式清楚地显示了正在执行的操作,因此,我相信可能需要进行一些调整,以使其更加高效或美观。
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()
将在每个步骤中返回一个三元组,其中包含目录,目录中的目录以及其中的文件的路径。它以自上而下或自下而上的方式“行走”在树上,并且不会一次停止。
因此,内置的next()
方法用于生成第一个结果(当前目录的结果),然后使用[1]
或[2]
获取目录,并文件。
如果您不仅要重命名文件,还要重命名子目录中的所有项目,请用next(os.walk(srcpath))[2]
替换os.listdir(srcpath)
。此列表包含文件和目录。
注意:我之所以要在一个单独的循环中首先计算重复名称列表,是为了使第一次出现的位置保持不变。在同一循环中重命名会错过第一个循环。