好的,我重新阅读了您的问题,我想我知道出了什么问题。
1.) os.walk() 迭代器是递归的,即如果您使用os.walk(r'C:\'),它将遍历所有文件夹并找到所有 C下的文件驾驶。现在我不确定您的 C:\folderPath 中是否有任何子文件夹。如果是这样,并且任何文件夹/文件格式都不是 C:\folderPath 的约定,那么您的代码将会很糟糕。
2.) 当您遍历 files 时,您是在 split() 输入错误的对象。您的问题表明您要拆分文件夹名称,但您的代码正在拆分 files 可迭代,这是当前迭代目录下所有文件的列表。这并不能实现你想要的。根据您的 ABCDEF 文件夹是 C:\folderPath 还是其中的子文件夹,您需要进行不同的编码。
3.) 你已经从os.path 导入了join,但你最终还是调用了全名os.path.join(),这是多余的。要么只使用import os 并调用os.path.join(),要么只使用您当前的导入,只需join()。
说了这么多,以下是我的编辑:
答案 1:
如果您的 ABCDEF 是分配的文件夹
import os
from os.path import join
path = r'C:\ABCDEF - THIS - IS - MY - FOLDER - NAME'
for root, dirs, files in os.walk(path):
folder = root.split("\\")[-1] # This gets you the current folder's name
for i, image in enumerate(files):
new_image = "{0}_{1}.jpg".format(folder.split(' - ')[0], i + 1)
os.rename(join(path, image), join(path, new_image))
break # if you have sub folders that follow the SAME structure, then remove this break. Otherwise, keep it here so your code stop after all the files are updated in your parent folder.
答案 2:
假设您的 ABCDEF 都是指定目录下的子文件夹,并且所有都遵循相同的命名约定。
导入操作系统
from os.path 导入加入
path = r'C:\parentFolder' # The folder that has all the sub folders that are named ABCDEF...
for i, (root, dirs, files) in enumerate(os.walk(path)):
if i == 0: continue # skip the parentFolder as it doesn't follow the same naming convention
folder = root.split("\\")[-1] # This gets you the current folder's name
for i, image in enumerate(files):
new_image = "{0}_{1}.jpg".format(folder.split(' - ')[0], i + 1)
os.rename(join(path, image), join(path, new_image))
注意:
如果您的方案不属于上述任何一种,请说明您的文件夹结构是什么(包括所有子文件夹和子文件的示例)。请记住,一致性是确定代码应该如何工作的关键。如果不一致,最好的办法是分别在 每个 目标文件夹上使用答案 1。
变化:
1.) 您可以在不执行i += 1 的情况下获得增量索引。 enumerate() 是一个很棒的可迭代工具,它还可以为您提供迭代次数。
2.) 您的split() 应该在文件夹名称上操作,而不是files(可迭代)。在您的情况下,image 是实际文件名,files 是当前迭代目录中的文件列表。
3.) 使用str.format() function 使您的新文件格式更易于阅读。
4.) 您会注意到使用了split("\\") 而不是split(r"\"),那就是because a single backslash cannot be a raw string.
现在应该可以了。我最终做了比预期更多的研究,例如how to handle the os.walk() properly in both scenarios. 供将来参考,谷歌搜索有很长的路要走。我希望这最终能回答你的问题。请记住,进行自己的研究并清楚地展示您的问题将使您获得更有效的答案。
奖励:如果你有 python 3.6+,你甚至可以使用f strings 作为你的新文件名,最终看起来真的很酷:
new_image = f"{image.split(' - ')[0]}_{i+1}.jpg"