Python 如何重命名文件以包含其所在子文件夹的名称?

Python 如何重命名文件以包含其所在子文件夹的名称?,python,Python,为了便于组织,我希望一个文件包含我放入文件夹的子文件夹的名称。但是,我不知道如何使用os.walk() 为简洁起见,假设我在两个子文件夹中有一个文件夹: ['Patch Dock 6HU整个ECD GABA','Patch Dock 6HUP TMD安定] 在每个子文件夹中都会有名称相同的文件: ['docking.res.10.pdb','docking.res.11.pdb','docking.res.12.pdb'] 我想要的输出将在每个子文件夹中,文件将命名为: [ 'Patch Doc

为了便于组织,我希望一个文件包含我放入文件夹的子文件夹的名称。但是,我不知道如何使用
os.walk()

为简洁起见,假设我在两个子文件夹中有一个文件夹:

['Patch Dock 6HU整个ECD GABA','Patch Dock 6HUP TMD安定]

在每个子文件夹中都会有名称相同的文件:

['docking.res.10.pdb','docking.res.11.pdb','docking.res.12.pdb']

我想要的输出将在每个子文件夹中,文件将命名为:

[ 'Patch Dock 6HUO Entire ECD GABA docking.res.10.pdb', 'Patch Dock 6HUO Entire ECD GABA docking.res.11.pdb', 'Patch Dock 6HUO Entire ECD GABA docking.res.12.pdb' ]

[ 'Patch Dock 6HUP TMD Diazepam docking.res.10.pdb', 'Patch Dock 6HUP TMD Diazepam docking.res.11.pdb', 'Patch Dock 6HUP TMD Diazepam docking.res.12.pdb' ]

这是我到目前为止尝试过的,但我不确定在使用嵌套for循环(如os.walk()所需)时如何访问文件名和子文件夹名


os.chdir(pathway)


pathway_tree = os.walk(pathway)

try:
    #

    for subdir, dirs, files_in_dirs in pathway_tree:
        print(f"dirs! {dirs}")
        print(files_in_dirs)

        for file in files_in_dirs:
            #print(f"file names from files in dirs loop {file} and a subfolder name ")
            y =8 # place holder 

            for nested_folder_name in dirs:

                #print(f"nested file name! {nested_file_name}")
                #print(f" files in dir : {file}")
                t = 2 # place holder 

            print(f"nested file name {nested_folder_name} and file name {file}")
except NameError:
    pass



这给了我以下的输出:

dirs! ['Patch Dock 6HUO Entire ECD GABA', 'Patch Dock 6HUO Entire ECD Xanax', 'Patch Dock 6HUO Xanax Interface', 'Patch Dock 6HUP Diazepam Interface', 'Patch Dock 6HUP Entire ECD Diazepam', 'Patch Dock 6HUP Entire ECD GABA', 'Patch Dock 6HUP TMD Diazepam']
[]
dirs! []
[]
dirs! []
[]
dirs! []
[]
dirs! []
[]
dirs! []
['docking Partial Pocket.pdb', 'docking.res.1.pdb', 'docking.res.10.pdb', 'docking.res.11.pdb', 'docking.res.12.pdb', 'docking.res.13.pdb', 'docking.res.14.pdb', 'docking.res.15.pdb', 'docking.res.16.pdb', 'docking.res.17.pdb', 'docking.res.18.pdb', 'docking.res.19.pdb', 'docking.res.2.pdb', 'docking.res.20.pdb', 'docking.res.3.pdb', 'docking.res.4.pdb', 'docking.res.5.pdb', 'docking.res.6.pdb', 'docking.res.7.pdb', 'docking.res.8.pdb', 'docking.res.9.pdb']

Process finished with exit code 0


只要我们确保使用的是完整路径名,
subdir
就是文件目录的全名,它的基本名称就是您要添加到文件中的名称。最好不要更改目录(尤其是不要使用在os.walk中更改的路径),只需将该路径设置为绝对路径并基于它执行路径操作即可

try:
    for subdir, dirs, files_in_dirs in os.walk(os.path.abspath(pathway)):
        print(f"dirs! {dirs}")
        print(files_in_dirs)
        parent_name = os.path.basename(subdir)
        for file in files_in_dirs:
            if not file.startswith(parent_name):
                new_name = f"{parent_name} {file}"
                os.rename(os.path.join(subdir, file), os.path.join(subdir, newname))
except NameError:
    pass

我不确定您是要重命名所有文件,还是只想在列表中保存以其子文件夹为前缀的所有文件

对于第二行,您可以使用该行(显示为5行以提高可读性),例如:

[
join(dirpath,dirpath.replace(“/”,“)+”+文件名)
对于dirpath,u,os.walk(顶部文件夹)中的文件名
用于文件名中的文件名
]
列表理解中有一个双重迭代,首先遍历给定的
top\u文件夹
(可能是您所称的
路径
),然后通过了解当前路径来迭代当前子文件夹中的文件。然后,只需将路径分隔符(对我来说是
“/”
)替换为另一个字符,例如
”,即可将当前子文件夹放到当前文件名中。然后将每个结果作为元素添加到列表中


首先,已经有了由提供的解决方案。

谢谢,我本来想重命名目录中的文件,但现在遇到了其他问题。有没有办法删除
.res
?例如,我想将
'docking.res.10.pdb'
转换为
'docking10.pdb'
。我尝试过使用
replace()
,它返回所需文件名的列表,但实际上并没有更改目录中文件的名称。