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
相关产品推荐
相关产品推荐

