重命名包含模式的文件,循环遍历子文件夹

时间:2021-06-05 18:01:19

标签: python

我有一个主文件夹,其中包含多个子文件夹,其中包含多个文件。我正在尝试遍历子文件夹并重命名匹配特定模式的文件。这是我所拥有的:

import os
from fnmatch import fnmatch

pattern = "*z_2*"
pattern2 ='b_2.txt'
path = r'C:\Users\Desktop\123'
list1= []

for (dirpath, dirnames, filenames) in os.walk(path):
    list1+= [os.path.join(dirpath, file) for file in filenames]
    for i in list1:
        if fnmatch(i,pattern):
            a=os.path.join(path,i)
            b = os.path.dirname(i)
            os.rename(a, os.path.join(b,pattern2))

我不明白的是,为什么当我指定 use os.rename 时,它会在指定的子文件夹中创建一个文本文件,结果是:

FileExistsError: [WinError 183] Cannot create a file when that file already exists: 'C:\\Users\\Desktop\\ABC\\_100\\az_207.txt' -> 'C:\\Users\\Desktop\\ABC\\_100\\b_2.txt'

1 个答案:

答案 0 :(得分:1)

问题在于,当您重命名文件时,目标文件路径取决于 b,而后者仅取决于 dirnamei 部分,而不是 i 本身。因此,当您对 list1 的循环在同一目录中找到多个文件时,它们都会获得相同的 os.path.join(b,pattern2) 值。因此,您的代码正在创建多个同名文件。

您可能希望在构建目标文件名时重复使用 a 的某些部分,以确保唯一性。