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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.12 04:58:24