Python如何将含键值对字符串的嵌套列表转换为指定字典列表并导出JSON
方案1:优化原有逻辑,从源头生成可直接序列化的结果
你之前写的代码存在两个核心问题:
- 计数逻辑有bug:把统计字典
d放在逐行遍历的循环内部,每读一行都会把之前累计的所有发言人的计数重复累加一遍,最终得到的发言次数统计是不准确的 - 冗余的字符串拼接:特意把字典格式拼成带单引号的字符串嵌套结构,后续还要额外做解析,很容易出现格式错漏
直接用下面的代码就能一步到位得到符合JSON格式要求的结果,不需要额外转换:
import json from collections import defaultdict # 自动初始化新发言人的计数为0,不用手动判断是否存在 chat_counter = defaultdict(int) # 用with上下文管理器操作文件,读完自动关闭,避免资源泄露 with open("input.txt", "r", encoding="utf-8") as f: for line in f: # 跳过文件里的空行,避免split时索引越界 stripped_line = line.strip() if not stripped_line: continue # 按连续的空白字符分割每行,结构为 [时间戳, 发言人..., 聊天内容...] line_parts = stripped_line.split() # 从第2个元素开始,找到第一个带冒号的元素,就是发言人名字的结尾 speaker_end_pos = 1 while speaker_end_pos < len(line_parts) and ":" not in line_parts[speaker_end_pos]: speaker_end_pos += 1 # 拼接所有发言人部分的内容,去掉末尾的冒号 speaker_name = " ".join(line_parts[1:speaker_end_pos+1]).rstrip(":") # 该发言人计数+1 chat_counter[speaker_name] += 1 # 直接生成符合要求的字典列表,天生支持JSON序列化 result = [ {"Person": name, "Message": count} for name, count in chat_counter.items() ] # 写入JSON文件,ensure_ascii=False避免中文乱码,indent=4生成可读性好的格式化文件 with open("speaker_message_count.json", "w", encoding="utf-8") as f: json.dump(result, f, ensure_ascii=False, indent=4)
方案2:如果已经生成了字符串嵌套列表,转成合法字典结构
如果你已经跑完之前的代码,拿到了类似下面的结构:
[["'Person':Yiyang Chen,'Message':10"], ["'Person':Junbo Sheng,'Message':2"]...]
可以通过拆分字符串的方式还原为合法的字典列表,代码如下:
import json # 示例的原始嵌套列表 raw_data = [ ["'Person':Yiyang Chen,'Message':10"], ["'Person':Junbo Sheng,'Message':2"] ] valid_result = [] for entry in raw_data: # 取出嵌套里的拼接字符串 raw_content = entry[0] # 按逗号拆分出两个独立的键值对片段 kv_segments = raw_content.split(",") current_dict = {} for seg in kv_segments: # 去掉所有多余的单引号 clean_seg = seg.replace("'", "") # 只拆分第一个冒号,避免发言人名字里带冒号导致拆分错误 key, value = clean_seg.split(":", 1) # Message字段是整数类型,需要做类型转换 if key == "Message": value = int(value) current_dict[key] = value valid_result.append(current_dict) # 转换完成后可直接通过json.dumps序列化 print(json.dumps(valid_result, ensure_ascii=False))
初学者注意事项
- 处理JSON相关需求时,尽量在生成环节就使用Python原生的字典、列表结构,不要先拼接字符串再回头解析,很容易出现引号不匹配、类型错误的问题
- 拆分包含冒号的字符串时,优先用
split(":", 1)限制拆分次数,避免内容里的特殊符号导致解析错误 - 调用
json.dump/json.dumps时加上ensure_ascii=False参数,否则中文等非ASCII字符会被转成不可读的unicode编码
内容的提问来源于stack exchange,提问作者Simran Makandar
相关产品推荐
相关产品推荐

