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

如何将含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)

错误根源

  1. 重复键冲突:JSON规范要求对象内的键必须唯一,但你的每个字典都包含两个"y"键,这会直接导致解析失败。
  2. 多余逗号:每个字典最后一个键值对末尾的逗号(比如"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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.02 01:01:18