我想根据图像所在文件夹名称的一部分重命名图像并迭代图像。我正在使用os.walk,我能够重命名文件夹中的所有图像,但无法弄清楚如何使用文件夹名称中第一个连字符左侧的字母作为图像名称的一部分。
文件夹名称:ABCDEF - THIS IS - MY FOLDER - NAME
文件夹中的当前图像名称:
dsc_001.jpg
dsc_234.jpg
dsc_123.jpg
想要更改为显示如下:
ABCDEF_1.jpg
ABCDEF_2.jpg
ABCDEF_3.jpg
我拥有的是这个,但我不知道为什么我无法用连字符分割文件名:
import os
from os.path import join
path = r'C:\folderPath'
i = 1
for root, dirs, files in os.walk(path):
for image in files:
prefix = files.split(' - ')[0]
os.rename(os.path.join(path, image), os.path.join(path, prefix + '_'
+ str(i)+'.jpg'))
i = i+1
答案 0 :(得分:0)
好的,我已经重新阅读了你的问题,我想我知道出了什么问题。
1。)os.walk()
iterable是递归的,即如果你使用os.walk(r'C:\')
,它将遍历所有文件夹并找到 all C盘下的文件。现在我不确定你的C:\ folderPath中是否有任何子文件夹。如果是这样,并且任何文件夹/文件格式都不是C:\ folderPath的约定,那么您的代码将会有不好的时间。
2。)当您遍历files
时,您split()
错误的对象。您的问题表明您要拆分文件夹名称,但您的代码正在拆分files
iterable,它是当前迭代目录下所有文件的列表。那不能实现你想要的。根据您的ABCDEF
文件夹是C:\ folderPath还是其中的子文件夹,您需要采用不同的编码方式。
3.。)您已从join
导入os.path
但仍然最终调用全名os.path.join()
,这是多余的。只需import os
并致电os.path.join()
或仅使用您当前的导入,只需join()
。
说完所有这些,这是我的编辑:
如果您的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.
假设您的ABCDEF是指定目录下的所有子文件夹,并且所有符合相同的命名约定。
导入操作系统 来自os.path import join
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"