Python遍历字典列表搜索目录并复制文件问题求助
解决Python字典多值列表遍历的文件复制问题
问题背景
我刚接触Python,在实现一个批量文件复制脚本时卡壳了:我需要构建一个键为合同名称、值为对应合同图纸文件名列表的字典,接着用这个字典去检索指定目录里的文件,把匹配的图纸复制到以合同名命名的文件夹中(每个合同对应2到100张图纸)。原本当字典每个键只对应单个值时代码能正常跑,但改成值为列表后就报错了——用itervalues()遍历字典值时触发了ValueError: too many values to unpack错误。
错误代码问题分析
原代码里的核心bug出在字典遍历的逻辑上:
for root, dirs, files in os.walk(path): for key, value in recDCT.itervalues(): if value in files: shutil.copy(os.path.abspath(root + '/' + value), os.path.abspath(outLoc + '/' + key))
recDCT.itervalues()返回的是每个键对应的文件名列表,但你试图把这个列表直接拆成key, value两个变量,这完全不符合逻辑——一个包含多个元素的列表没法被解包成单个的键和值,自然就触发了解包错误。
修正方案及代码
正确的思路是先遍历字典的每个合同(键),再逐个遍历该合同对应的所有图纸文件名(值列表),这样就能单独处理每个图纸文件了。修正后的完整代码如下:
import os import shutil import arcpy recDCT = {} deviceFC = "你的要素类路径" contract = "合同名字段" CurrDP = "图纸名字段" path = "要搜索的目标目录路径" outLoc = "文件复制的根目录路径" copy_count = 0 # 统计复制成功的文件数量 # 构建合同-图纸列表的字典 with arcpy.da.SearchCursor(deviceFC, [contract, CurrDP]) as curs: for row in curs: # 用is not None替代<>,更符合Python语法规范 if row[1] is not None and row[0] is not None: if row[0] in recDCT: recDCT[row[0]].append(row[1]) else: recDCT[row[0]] = [row[1]] # 遍历目录并复制匹配的文件 for root, dirs, files in os.walk(path): # 先遍历每个合同(字典的键) for contract_name in recDCT: # 再遍历该合同下的所有图纸文件名(字典的值列表) for drawing_file in recDCT[contract_name]: if drawing_file in files: # 用os.path.join拼接路径,避免跨平台分隔符问题 source_path = os.path.abspath(os.path.join(root, drawing_file)) target_folder = os.path.abspath(os.path.join(outLoc, contract_name)) # 确保目标文件夹存在,不存在则创建 os.makedirs(target_folder, exist_ok=True) shutil.copy(source_path, target_folder) copy_count += 1 print(f"完成!共复制成功{copy_count}个文件")
另外补充了两个实用优化:
- 用
os.path.join()拼接路径,比直接用+ '/'更安全,能适配不同操作系统的路径分隔符 - 添加
os.makedirs(target_folder, exist_ok=True),确保目标合同文件夹存在(如果你的脚本没提前创建的话)
内容的提问来源于stack exchange,提问作者Stephen.H
相关产品推荐
相关产品推荐

