使用更改图像名称手术室步行包括父目录名

2024-05-17 19:23:47 发布

您现在位置:Python中文网/ 问答频道 /正文

我想根据图像所在文件夹的部分名称重命名图像,并在图像中迭代。我正在使用手术室步行我可以重命名文件夹中的所有图像,但不知道如何使用文件夹名称中第一个连字符左边的字母作为图像名称的一部分。

文件夹名:ABCDEF - THIS IS - MY FOLDER - NAME

文件夹中的当前图像名称:

dsc_001.jpg 
dsc_234.jpg
dsc_123.jpg

想改成这样:

^{pr2}$

我有的是这个,但我不知道为什么我不能用连字符分割文件名:

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

Tags: pathin图像imageimport文件夹名称for
1条回答
网友
1楼 · 发布于 2024-05-17 19:23:47

好吧,我读了你的问题,我想我知道怎么了。在

1.)iterable是递归的,也就是说,如果使用os.walk(r'C:\'),它将遍历all文件夹并找到C驱动器下的all文件。现在我不确定您的C:\folderPath中是否有子文件夹。如果是这样,并且任何文件夹/文件格式都不是C:\folderPath的约定,那么您的代码将会很糟糕。在

2.)当您迭代files时,您split()使用了错误的对象。您的问题状态是希望拆分文件夹名称,但代码正在拆分filesiterable,它是当前迭代目录下所有文件的列表。这并不能实现你想要的。根据您的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都是指定目录下的所有子文件夹,并且其中的所有都遵循相同的命名约定。

导入操作系统 从操作系统路径导入联接

^{pr2}$

注:

如果您的场景不属于这两种情况,请说明您的文件夹结构是什么(一个包含所有子文件夹和子文件的示例)。记住,一致性是决定代码应该如何工作的关键。如果不一致,最好的办法是分别对每个目标文件夹使用答案1。在

更改:

1.)无需执行i += 1,就可以获得一个增量索引。^{}是iterables的一个很好的工具,它还提供了迭代次数。在

2.)您的split()应该在文件夹名上操作,而不是files(iterable)。在您的例子中,image是实际的文件名,files是当前迭代目录中的文件列表。在

3.)使用^{} function使新文件格式更易于阅读。在

4.)您将注意到使用了split("\\")而不是{},这就是because a single backslash cannot be a raw string.

现在应该可以了。最后我做了比预期更多的研究,比如how to handle the ^{} properly in both scenarios.以备将来参考,一点谷歌搜索就可以了。我希望这最终能回答你的问题。记住,做你自己的研究和清晰地展示你的问题会让你得到更有效的答案。在

额外好处:如果您有python 3.6+,您甚至可以使用f strings作为新文件名,这看起来非常酷:

new_image = f"{image.split(' - ')[0]}_{i+1}.jpg"

相关问题 更多 >