如何将含Python字典的文本文件转换为真实的Python字典列表
JSON解析错误解决方法
问题场景
你有一个格式不符合JSON规范的文本文件,内容示例如下:
[{ "x": 0.37375009059906006, "y": 0.858906626701355, "y": 1.2558532880291295e-08, }, { "x": 0.4551462233066559, "y": 0.8060519695281982, "y": -0.023612480610609055, }, { "x": 0.5198760032653809, "y": 0.7056148648262024, "y": -0.0391654446721077, }, etc, etc
你尝试用以下Python代码将其转换为合法的字典列表:
def create_array(type): path = f'data/hands/{type}' files = os.listdir(path) data = [] for file in files: with open(f'{path}/{file}', 'r') as f: c_data = json.loads(f.read()) data.append(c_data) data = [dict(x) for x in data] print(data)
运行时触发错误:json.decoder.JSONDecodeError: Expecting property name enclosed in double quotes: line 5 column 1 (Char 82)
错误根源
- 重复键冲突:JSON规范要求对象内的键必须唯一,但你的每个字典都包含两个
"y"键,这会直接导致解析失败。 - 多余逗号:每个字典最后一个键值对末尾的逗号(比如
"y": 1.2558532880291295e-08,后的逗号)也是JSON解析器无法容忍的格式问题。
解决方案
需要先预处理文本内容,修正这两个格式问题后再进行JSON解析。以下提供两种常见处理方式:
方式1:合并重复的y键为数组
如果需要保留所有y值,可以将同一字典内的两个y键合并成一个数组,同时移除多余逗号:
import os import json import re def create_array(type): path = f'data/hands/{type}' files = os.listdir(path) data = [] for file in files: with open(f'{path}/{file}', 'r') as f: raw_content = f.read() # 匹配重复的y键,合并为数组 raw_content = re.sub(r'"y": (\d+\.?\d*(?:e[+-]\d+)?),\s*"y": (\d+\.?\d*(?:e[+-]\d+)?)', r'"y": [\1, \2]', raw_content) # 移除字典结尾前的多余逗号 raw_content = re.sub(r',\s*}', '}', raw_content) # 解析修正后的合法JSON c_data = json.loads(raw_content) data.append(c_data) print(data)
方式2:只保留最后一个y键
如果只需要保留每个字典中最后出现的y值,可以移除前面的重复y键:
import os import json import re def create_array(type): path = f'data/hands/{type}' files = os.listdir(path) data = [] for file in files: with open(f'{path}/{file}', 'r') as f: raw_content = f.read() # 移除第一个y键及其值 raw_content = re.sub(r'"y": \d+\.?\d*(?:e[+-]\d+)?,\s*', '', raw_content) # 移除字典结尾前的多余逗号 raw_content = re.sub(r',\s*}', '}', raw_content) c_data = json.loads(raw_content) data.append(c_data) print(data)
注意事项
- 正则表达式的匹配逻辑可以根据你实际的文本格式微调,确保覆盖所有重复键和多余逗号的场景。
- 如果原始文件的格式问题更复杂(比如换行、空格不规则),可以考虑逐行读取并处理文本,进一步保证格式合法性。
内容的提问来源于stack exchange,提问作者DirpyToes
相关产品推荐
相关产品推荐

