Python:如何处理分隔符例外,将字符串转换为嵌套字典?
处理含逗号字段的字符串转字典问题
看你的情况,核心痛点就是Reviewed字段里的列表带逗号,直接用逗号分割整个字符串会把列表内容拆成错误的键值对,手动改大数据集肯定不现实对吧?别自己硬写解析逻辑了,Python内置的json模块就是专门干这个的,用它完全能解决问题。
为什么你当前的代码会出错?
你现在是把字典转成字符串后,粗暴地用逗号分割,但这种方式完全没考虑JSON的语法结构——列表里的逗号是合法的内部分隔符,不是键值对的分隔符,自然会把Reviewed里的内容拆成独立部分,导致生成错误的嵌套字典。
正确的解决方案
你的原始数据其实是每行一个合法的JSON对象,直接逐行解析就行,根本不需要自己做字符串分割。下面是具体实现:
1. 直接解析单个JSON字符串
假设你的reviewers_list里每个元素都是一个合法的JSON字符串,用json.loads()直接解析:
import json # 示例数据 reviewers_list = [ '{"Username": "bkpn1412", "DOB": "31.07.1983", "State": "Oregon", "Reviewed": ["cea76118f6a9110a893de2b7654319c0"]}', '{"Username": "gqjs4414", "DOB": "27.07.1998", "State": "Massachusetts", "Reviewed": ["fa04fe6c0dd5189f54fe600838da43d3"]}', '{"Username": "eehe1434", "DOB": "08.08.1950", "State": "Idaho", "Reviewed": []}', '{"Username": "hkxj1334", "DOB": "03.08.1969", "State": "Florida", "Reviewed": ["f129b1803f447c2b1ce43508fb822810", "3b0c9bc0be65a3461893488314236116"]}', '{"Username": "jjbd1412", "DOB": "26.07.2001", "State": "Georgia", "Reviewed": []}' ] # 解析每个JSON字符串为字典 reviewers_dicts = [json.loads(item) for item in reviewers_list] # 输出验证 for user_dict in reviewers_dicts: print(user_dict) print(f"Reviewed字段类型: {type(user_dict['Reviewed'])}")
运行后你会发现,Reviewed字段完美保留了列表结构,不管里面有多少逗号都不会被错误分割。
2. 如果需要合并成嵌套字典
要是你想把这些用户数据合并成一个大的嵌套字典(比如用Username作为主键),可以这样处理:
merged_data = {} for user_dict in reviewers_dicts: username = user_dict.pop("Username") merged_data[username] = user_dict print(merged_data)
3. 处理拼接后的大字符串
如果你的rdict是已经把所有字典字符串拼接成的一个大字符串(比如多个JSON对象连在一起),可以先把它改成合法的JSON数组格式再解析:
import json # 假设rdict是拼接后的字符串 rdict = '{"Username": "bkpn1412", "DOB": "31.07.1983", "State": "Oregon", "Reviewed": ["cea76118f6a9110a893de2b7654319c0"]} {"Username": "gqjs4414", "DOB": "27.07.1998", "State": "Massachusetts", "Reviewed": ["fa04fe6c0dd5189f54fe600838da43d3"]}' # 转换为合法JSON数组 fixed_rdict = f"[{rdict.replace(' ', ',')}]" reviewers_dicts = json.loads(fixed_rdict)
这样也能正确解析出所有字典,完全不会破坏Reviewed的列表结构。
核心思路总结
自己手动用split解析JSON格式的字符串是吃力不讨好的,因为JSON有严格的语法规则,内置的json模块已经帮我们处理了所有边界情况(比如字符串里的逗号、引号、嵌套结构等),直接用它就完事了,既高效又不会出错。
内容的提问来源于stack exchange,提问作者shogga22
相关产品推荐
相关产品推荐

