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

如何解析Excel中无文本限定符的类dict字符串并转换为字典?

报错原因

ValueError: dictionary update sequence element #0 has length 1; 2 is required
该报错的触发原因是dict()构造函数不支持直接传入原始字符串作为输入,它要求输入为可迭代的键值对序列(如二元组列表、已构造的字典对象等)。
除此之外,你持有的类字典字符串本身不符合Python字典字面量、JSON的标准格式:

  • 键名未加引号包裹
  • 字符串类型的取值未加引号包裹
  • 数字存在前导零(如0815属于Python非法十进制整数字面量)
解决方法

你可以通过以下两种常用方式完成转换:

方法1:正则补全格式后安全转换

通过正则补全引号后调用ast.literal_eval完成转换,该方法安全性高、适配性强,适合格式灵活的场景:

import re
import ast

# 你的原始类字典字符串
raw_str = "{Item: 0815, sequence: 1, qty: 3, name: some name, comapny: some company}"

# 给所有键名加双引号
processed = re.sub(r'([{,])\s*([a-zA-Z_]\w*)\s*:', r'\1 "\2":', raw_str)
# 给非数字类型的取值加双引号
processed = re.sub(r':\s*([^0-9{\[tf][^,}]*)', lambda m: f': "{m.group(1).strip()}"', processed)
# 可选:给带前导零的数字加双引号(如果需要保留Item字段的前导零请保留该步骤)
processed = re.sub(r':\s*0(\d+)', r': "0\1"', processed)

# 安全转换为字典
item_dict = ast.literal_eval(processed)
print(item_dict)
# 输出示例:{'Item': '0815', 'sequence': 1, 'qty': 3, 'name': 'some name', 'comapny': 'some company'}

方法2:手动拆分解析

如果你的字符串格式完全固定,可直接拆分解析,性能更高、无正则匹配误差风险:

raw_str = "{Item: 0815, sequence: 1, qty: 3, name: some name, comapny: some company}"
# 去除首尾大括号,拆分所有键值对
kv_pairs = [pair.strip() for pair in raw_str.strip('{}').split(',')]
item_dict = {}
for pair in kv_pairs:
    # 仅拆分第一个冒号,避免取值中存在冒号导致解析错误
    key, value = pair.split(':', 1)
    key = key.strip()
    value = value.strip()
    # 根据业务需要自行调整字段类型转换逻辑
    if key in ('sequence', 'qty'):
        value = int(value)
    item_dict[key] = value
print(item_dict)
注意事项
  • 禁止直接使用eval()处理转换后的字符串,ast.literal_eval()仅会解析Python标准字面量,不会执行任意代码,安全性远高于eval()
  • 如果需要批量处理Excel整列数据,可以把上述逻辑封装为函数,通过pandas的apply方法批量应用到目标列

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 23:45:05