如何解析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
相关产品推荐
相关产品推荐

