You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python构建字典遇TabError缩进问题及图片批量移动需求求助

问题解决与代码修正

1. 缩进错误(TabError)的解决

Python对缩进要求严格,禁止混合使用制表符(Tab)和空格。解决方式:

  • 统一将代码缩进替换为4个空格(Python官方推荐规范),可通过编辑器批量转换(比如VS Code中按Ctrl+Shift+P,选择「Convert Indentation to Spaces」)
  • 逐段检查循环、函数内的代码块,确保所有缩进层级一致

2. 语法错误修正

你标注的错误行fullpath_filelist = {file: os.path.join(root,dirs, file}存在两个问题:

  • os.path.join参数错误:dirs是子目录列表,不是单个路径,正确写法为os.path.join(root, file)
  • 字典语法缺失:缺少闭合括号,且原代码每次循环会覆盖整个字典,应改为往字典中添加键值对:fullpath_filelist[file] = os.path.join(root, file)

3. 其他逻辑问题修正

  • Windows路径转义:路径中的\需转义为\\,或使用原始字符串(比如r'C:\Printing\Python\data\datafile.xlsx'),避免转义字符解析错误
  • 文件移动路径错误:shutil.move需要传入文件完整路径,而非仅文件名,应使用字典中存储的完整路径作为源路径
  • 目标目录提前创建:移动文件前需确保目标目录存在,用os.makedirs并设置exist_ok=True避免报错
  • 函数执行顺序调整:应先执行find_category()更新Excel内容,再加载文件处理,否则读取的是未更新的原始数据

修正后的完整代码

#! python 3
# 整理图片:匹配Excel中的SKU与图片名称,将匹配成功的图片移入指定文件夹

import openpyxl, re, os, shutil

print('正在打开工作簿...')

# 配置参数
Main_Searchterm = 'Find'
Sub_Searchterm  = 'Marine'
Data_path = r'C:\Printing\Python\data\datafile.xlsx'
Image_folder = r'C:\Printing\Python\data\images'
Sorted_folder = r'C:\Printing\Python\data\sorted'

def find_category():
    wb = openpyxl.load_workbook(Data_path)
    sheet = wb['Sheet1']

    # 查找主搜索词并写入第6列
    keyword_main = re.compile(Main_Searchterm)
    for rowNum in range(2, sheet.max_row + 1):
        category = sheet['E' + str(rowNum)].value
        if category:
            mo = keyword_main.search(category)
            if mo and mo.group() == Main_Searchterm:
                sheet.cell(row=rowNum, column=6).value = Main_Searchterm

    # 查找子搜索词并写入第7列
    keyword_sub = re.compile(Sub_Searchterm)
    for rowNum in range(2, sheet.max_row + 1):
        category = sheet['E' + str(rowNum)].value
        if category:
            mo = keyword_sub.search(category)
            if mo and mo.group() == Sub_Searchterm:
                sheet.cell(row=rowNum, column=7).value = Sub_Searchterm

    wb.save(Data_path)

# 先执行分类标记,再加载处理后的Excel文件
find_category()
wb = openpyxl.load_workbook(Data_path)
sheet = wb['Sheet1']

# 获取所有图片的完整路径,存入字典(文件名: 完整路径)
image_fullpaths = {}
for root, _, files in os.walk(Image_folder):
    for file in files:
        # 只处理图片文件,可根据需求添加更多后缀
        if file.lower().endswith(('.png', '.jpg', '.jpeg', '.gif')):
            image_fullpaths[file] = os.path.join(root, file)

# 获取Excel中的SKU列表,存入集合提高匹配效率
sku_set = set()
for rowNum in range(2, sheet.max_row + 1):
    sku = sheet['H' + str(rowNum)].value
    if sku:
        sku_set.add(str(sku))

# 移动匹配成功的图片
target_dir = os.path.join(Sorted_folder, Main_Searchterm, Sub_Searchterm)
# 创建目标目录,不存在则创建,已存在则不报错
os.makedirs(target_dir, exist_ok=True)

for filename, full_path in image_fullpaths.items():
    if str(filename) in sku_set:
        try:
            shutil.move(full_path, os.path.join(target_dir, filename))
            print(f"已移动: {filename}")
        except Exception as e:
            print(f"移动失败 {filename}: {str(e)}")

关键改进说明

  • 统一使用4个空格缩进,彻底解决缩进混合的问题
  • 修复字典赋值逻辑,正确存储每个图片的完整路径
  • 用集合存储SKU,大幅提升匹配效率
  • 增加图片后缀过滤,避免处理非图片文件
  • 提前创建目标目录,避免移动时因目录不存在报错
  • 调整函数执行顺序,确保处理的是更新后的Excel数据
  • 添加异常捕获,输出移动结果,方便排查问题

内容的提问来源于stack exchange,提问作者chao liu

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.17 22:01:15