代码之家  ›  专栏  ›  技术社区  ›  pankaj mishra

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

  •  0
  • pankaj mishra  · 技术社区  · 7 年前

    我有一个文件夹结构,如下所示

    Folder_structure

    有几个子文件夹具有重复的名称,我只想在遇到任何重复的子文件夹名称时,它应该以父文件夹名称作为前缀。

    DIR2>次曲面1 应更名为 DIR2>DIR2_SUDIR1 ,当文件夹重命名为DIR2_SUDIR1时,此文件夹中的文件也应具有与其父文件夹相同的前缀。 如。 DIR2>细分市场1>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 回复  |  直到 7 年前
        1
  •  1
  •   shriakhilc    7 年前

    下面的代码片段应该能够实现您的愿望。我写这篇文章的方式清楚地显示了正在做的事情,所以我相信可能会有一些调整,使它更高效或优雅。

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

    注: