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



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

import os
from fnmatch import fnmatch
pattern = "*z_2*"
pattern2 ='b_2.txt'
path = r'C:UsersDesktop123'
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))

我不明白的是,为什么当我指定使用 os 时。重命名,而是在指定的子文件夹中创建一个文本文件,导致:

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'

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

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

最新更新