查找重复的文件夹并通过在python中为父文件夹名称加上前缀来重命名它们

时间:2018-12-18 10:37:25

标签: python

我具有如下所示的文件夹结构

Folder_structure

有几个具有重复名称的子文件夹,我想要做的就是遇到任何重复的子文件夹名称时,都应该在其父文件夹名称之前加上前缀。

例如 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)

1 个答案:

答案 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)。此列表包含文件和目录。

注意:我之所以要在一个单独的循环中首先计算重复名称列表,是为了使第一次出现的位置保持不变。在同一循环中重命名会错过第一个循环。