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

2024-10-02 10:34:36 发布

您现在位置:Python中文网/ 问答频道 /正文

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

Folder_structure

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

例如。 DIR2>;SUBDIR1应重命名为DIR2>;DIR2\u SUDIR1,当文件夹重命名为DIR2\u SUDIR1时,此文件夹中的文件也应与其父文件夹具有相同的前缀。 例如,DIR2>;SUBDIR1>;subdirtst2.txt现在应该变成DIR2>;DIR2\u SUDIR1>;DIR2\u 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)

Tags: pathgttxt文件夹名称forosdir
1条回答
网友
1楼 · 发布于 2024-10-02 10:34:36

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

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的dir的路径。第一个循环检查这些“根目录”的所有直接子目录,并通过重复获取它们的交集(&)来创建一组重复的子目录名。你知道吗

然后它运行另一个循环,检查是否要重命名子目录,最后使用os.rename函数重命名子目录及其包含的所有文件。你知道吗

os.walk()返回一个三元组,每个步骤都包含目录的路径、目录中的目录和文件。它以自顶向下或自下而上的方式“遍历”树,并且不会在一次迭代中停止。你知道吗

因此,使用内置的next()方法生成第一个结果(当前目录的结果),然后使用[1][2]分别获取目录和文件。你知道吗

如果不仅要重命名文件,而且要重命名子目录中的所有项,请将next(os.walk(srcpath))[2]替换为os.listdir(srcpath)。此列表包含文件和目录。你知道吗

注意:我首先在一个单独的循环中计算重复名称列表的原因是,第一次出现的名称不会保持不变。在同一循环中重命名将丢失第一个循环。你知道吗

相关问题 更多 >

    热门问题