如何将连续拼接的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
相关产品推荐
相关产品推荐

