使用os.walk更改图像名称以包含父目录名

时间:2018-01-12 22:33:29

标签: python os.walk

我想根据图像所在文件夹名称的一部分重命名图像并迭代图像。我正在使用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

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()

说完所有这些,这是我的编辑:

答案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是指定目录下的所有子文件夹,并且所有符合相同的命名约定。

导入操作系统     来自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"