🧪 输出示例
| 原始文件名 | 新文件名 |
| XY1234567 黑色.jpg | XY1234567-01.jpg |
| XY1234567 藏青.jpg | XY1234567-03.jpg |
| XY1234567 米白.jpg | XY1234567-02.jpg |
终端输出:
✅ 重命名: XY1234567 黑色.jpg -> XY1234567-01.jpg
✅ 重命名: XY1234567 藏青.jpg -> XY1234567-03.jpg
✅ 重命名: XY1234567 米白.jpg -> XY1234567-02.jpg
🤖 Assistant
从文件名的 第十位字符到文件名的最后 进行精准匹配,并找到颜色名称,而不是简单的包含字符匹配。
修改后的逻辑:
我们可以做如下调整:
- 从文件名的第十位开始,到文件名的最后,提取出一个子字符串。
- 直接将这个子字符串与颜色名称进行精确匹配。
方案:
我们修改代码,使其从第十位到文件名的末尾提取出一个 子字符串 ,然后与颜色名称进行 精准匹配。
修改后的代码(精确匹配颜色):
import os
import pandas as pd
# 读取颜色编码表
excel_path = r'C:UsersAdministratorDesktop25 冬单品图片 col.xlsx' # Excel 文件路径
df = pd.read_excel(excel_path)
df.columns = df.columns.str.strip() # 去除列名空格
color_to_code = dict(zip(df['B'], df['A'])) # 中文名 -> 编码
# 图片目录
img_dir = r'C:UsersAdministratorDesktop25 冬单品图片 photo1' # 图片文件夹路径
for filename in os.listdir(img_dir):
if filename.lower().endswith(('.jpg', '.jpeg', '.png', '.JPG')):
# 去除文件名中的空格
name, ext = os.path.splitext(filename)
name = name.replace(" ", "") # 去除空格
# 提取从第十位开始到文件名末尾的子字符串
if len(name) >= 10:
color_substring = name[9:] # 获取从第十位到最后的子字符串
else:
print(f"⚠ 文件名长度不足 10 位,无法提取颜色:{filename}")
continue
# 根据子字符串查找颜色
color_name = None
for cname in color_to_code.keys():
if color_substring == cname: # 精准匹配颜色名称
color_name = cname
model = name[:9] # 前九位作为款号
break
if not color_name:
print(f"⚠ 未识别颜色名:{filename}(提取的子字符串:{color_substring})")
continue
# 获取颜色编码
color_code = color_to_code.get(color_name)
if not color_code:
print(f"⚠ 颜色编码未找到:{color_name}(文件:{filename})")
continue
# 新文件名格式:款号 - 颜色编码. 扩展名
new_filename = f"{model}-{color_code}{ext.lower()}"
src = os.path.join(img_dir, filename)
dst = os.path.join(img_dir, new_filename)
# 防止文件名冲突,自动添加后缀
original_dst = dst
counter = 1
while os.path.exists(dst):
new_filename = f"{model}-{color_code}_{counter}{ext.lower()}"
dst = os.path.join(img_dir, new_filename)
counter += 1
# 执行重命名
os.rename(src, dst)
print(f"✅ 重命名: {filename} -> {new_filename}")
主要改动:
- 提取子字符串:从第十位字符开始,提取文件名的剩余部分,即
color_substring = name[9:]。- 这部分子字符串将作为颜色名称进行精确匹配。
- 精准匹配颜色名称 :在颜色字典
color_to_code中进行 完全匹配,而不是包含匹配。如果找到完全匹配的颜色名称,就将其作为颜色。if color_substring == cname: - 处理文件名冲突:如果目标文件名已存在,继续添加编号直到找到不冲突的文件名。
示例:
假设有一个文件名 2541121M1- 灰蓝条纹.jpg,脚本会从第十位 M 开始提取子字符串 灰蓝条纹 ,然后与 color_to_code 中的颜色名称进行 完全匹配 。如果找到匹配的颜色 灰蓝条纹,则获取该颜色的编码,并重命名文件。
结果:
- 这个修改后的脚本将从文件名的第十位开始,提取到文件名的最后,精确匹配 颜色名称。
- 如果颜色名称正确匹配,系统会按新的规则重命名文件,防止文件名冲突。
正文完