Python 使用.rename和.endswith重命名多个图像

Python 使用.rename和.endswith重命名多个图像,python,rename,batch-rename,Python,Rename,Batch Rename,我一直在试着让它发挥作用,但我觉得我错过了什么。文件夹中有大量图像,我只需重命名部分文件名。例如,我试图将“RJ_200”、“RJ_600”和“RJ_60”1重命名为相同的“RJ_500”,同时保持文件名的其余部分不变 Image01.Food.RJ_200.jpg Image02.Food.RJ_200.jpg Image03.Basket.RJ_600.jpg Image04.Basket.RJ_600.jpg Image05.Cup.RJ_601.jpg Image06.Cup.RJ_60

我一直在试着让它发挥作用,但我觉得我错过了什么。文件夹中有大量图像,我只需重命名部分文件名。例如,我试图将“RJ_200”、“RJ_600”和“RJ_60”1重命名为相同的“RJ_500”,同时保持文件名的其余部分不变

Image01.Food.RJ_200.jpg
Image02.Food.RJ_200.jpg
Image03.Basket.RJ_600.jpg
Image04.Basket.RJ_600.jpg
Image05.Cup.RJ_601.jpg
Image06.Cup.RJ_602.jpg
这就是我目前所拥有的,但它一直只给我“else”,而不是实际重命名其中任何一个:

import os
import fnmatch
import sys

user_profile = os.environ['USERPROFILE']
dir = user_profile + "\Desktop" + "\Working"

print (os.listdir(dir))

for images in dir:
    if images.endswith("RJ_***.jpg"):
        os.rename("RJ_***.jpg", "RJ_500.jpg")
    else:
        print ("Arg!")

Python字符串方法
endswith
不与
*
进行模式匹配,因此您正在查找显式包含星号字符的文件名,但找不到任何文件名。 尝试使用正则表达式匹配文件名,然后显式生成目标文件名:

import os
import re
patt = r'RJ_\d\d\d'

user_profile = os.environ['USERPROFILE']
path = os.path.join(user_profile, "Desktop", "Working")
image_files = os.listdir(path)

for filename in image_files:
    flds = filename.split('.')
    try:
        frag = flds[2]
    except IndexError:
        continue
    if re.match(patt, flds[2]):
        from_name = os.path.join(path, filename)
        to_name = '.'.join([flds[0], flds[1], 'RJ_500', 'jpg'])
        os.rename(from_name, os.path.join(path, to_name))

请注意,您需要与文件的基本名称进行匹配,并在以后连接路径的其余部分。

您不需要使用
.endswith
。您可以使用
.split
拆分图像文件名并检查结果。由于涉及多个后缀字符串,我将它们全部放入
集合
,以进行快速成员资格测试

import os
import re
import sys

suffixes = {"RJ_200", "RJ_600", "RJ_601"}
new_suffix = "RJ_500"

user_profile = os.environ["USERPROFILE"]
dir = os.path.join(user_profile, "Desktop", "Working")

for image_name in os.listdir(dir):
    pieces = image_name.split(".")
    if pieces[2] in suffixes:
        from_path = os.path.join(dir, image_name)
        new_name = ".".join([pieces[0], pieces[1], new_suffix, pieces[3]])
        to_path = os.path.join(dir, new_name)
        print("renaming {} to {}".format(from_path, to_path))
        os.rename(from_path, to_path)

***在这种情况下不起作用。但是我不知道应该写什么来代替字符串中的反斜杠,需要加倍,或者添加
r
raw字符串前缀。i、 e.
user\u profile+“\\Desktop\\Working”
user\u profile+r”\Desktop\Working“
。我试过了,但在“重新匹配(patt,flds[2])时它总是给我一个错误:它说“列表索引超出范围”“对不起,我还在努力学习。我猜是因为我需要为它创建一个计数器?否则它只会在同一个文件夹中一次又一次地重复?显然,您目录中的某些文件的格式不是您想要更改的:您可以使用我所做的编辑中的代码跳过这些文件。非常感谢您的帮助!它像我想要的那样工作,让我走上了一条更加复杂的道路。我认为这很好。字符串中的文本反斜杠需要加倍,或者添加
r
raw字符串前缀。因此,除了对
path
变量执行此操作外,在您的回答中还需要对分配给
patt
的文本执行此操作。非常感谢您的理解!它给了我更多的东西去研究。很高兴听到这个。即使你接受另一个答案,至少投一票怎么样?需要更多的声誉!一旦发生这种情况,我就去做。