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

如何将连续拼接的JSON流转换为Pandas DataFrame?

解决拼接JSON流转Pandas DataFrame的问题

你的问题很典型——这种直接拼接的JSON流(非标准JSON数组格式)确实会让pd.read_json报错,因为它默认只识别单个JSON对象或用[]包裹、逗号分隔的JSON数组。下面给你两种直接转换的方案,不用先给每个JSON换行:

方案1:一次性处理(适合中小文件)

先读取整个文件内容,按每个JSON的起始标识分割,再逐个解析合并:

import pandas as pd
import json

# 读取文件内容
with open('tD.txt', 'r') as f:
    raw_content = f.read()

# 按每个JSON的起始标记分割,跳过第一个空元素
json_segments = raw_content.split('{"positionFlightMessage":')
valid_jsons = [f'{{"positionFlightMessage":{seg}}}' for seg in json_segments if seg]

# 逐个解析并扁平化嵌套结构
df_list = []
for json_str in valid_jsons:
    # 解析单个JSON
    json_data = json.loads(json_str)
    # 提取positionFlightMessage里的内容,同时保留顶层的messageSubtype字段
    flight_details = json_data['positionFlightMessage']
    flight_details['messageSubtype'] = json_data['messageSubtype']
    df_list.append(pd.json_normalize(flight_details))

# 合并成最终DataFrame
final_df = pd.concat(df_list, ignore_index=True)

方案2:生成器流式处理(适合大文件)

如果你的tD.txt体积很大,一次性加载会占用过多内存,用生成器逐段解析更高效:

import pandas as pd
import json

def parse_concat_json(file_path):
    with open(file_path, 'r') as f:
        content = f.read()
    # 分割JSON片段,跳过第一个空值
    for segment in content.split('{"positionFlightMessage":')[1:]:
        # 拼接回完整的JSON字符串
        full_json = f'{{"positionFlightMessage":{segment}}}'
        # 解析后提取需要的字段(可根据需求调整)
        data = json.loads(full_json)
        flight_data = data['positionFlightMessage']
        flight_data['messageSubtype'] = data['messageSubtype']
        yield flight_data

# 直接用json_normalize处理生成器输出
final_df = pd.json_normalize(parse_concat_json('tD.txt'))

为什么原来的方法会报错?

pd.read_json("tD.txt", orient='columns')会把整个文件当成一个完整的JSON对象/数组来解析,但你的文件是多个独立JSON直接拼接,当它读完第一个JSON后,后面还有剩余内容,就会触发ValueError: Trailing data错误。

可选调整

如果不需要扁平化嵌套结构,也可以直接用pd.DataFrame([json.loads(s) for s in valid_jsons]),但这样嵌套字段会以字典形式存在DataFrame的单元格里,后续处理不太方便,所以更推荐用json_normalize展开结构。

内容的提问来源于stack exchange,提问作者Bernouy

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.11 08:54:01