我有一个主文件夹,其中包含多个子文件夹,其中包含多个文件。我正在尝试遍历子文件夹并重命名匹配特定模式的文件。这是我所拥有的:
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'
答案 0 :(得分:1)
问题在于,当您重命名文件时,目标文件路径取决于 b
,而后者仅取决于 dirname
的 i
部分,而不是 i
本身。因此,当您对 list1
的循环在同一目录中找到多个文件时,它们都会获得相同的 os.path.join(b,pattern2)
值。因此,您的代码正在创建多个同名文件。
您可能希望在构建目标文件名时重复使用 a
的某些部分,以确保唯一性。