Python处理多对象JSON文件:流解析与event1-result配对需求
嘿,我明白你作为JSON新手的困惑——处理这种没有被数组包裹的多个独立JSON对象确实有点棘手,尤其是不能修改原文件的情况下。别担心,我们可以用流解析的方式逐个处理这些对象,完美提取你需要的event1和result配对。
解决方案:流解析多独立JSON对象
首先咱们得明确你的文件结构——通常这种多JSON对象的文件要么是每行一个独立JSON(最常见),要么是连续的无分隔JSON字符串(比如{"a":1}{"b":2}这种)。下面针对两种情况分别给出实现,同时覆盖常见的文件问题处理。
情况1:每行一个独立JSON对象
这是最普遍的场景,比如你的文件内容是:
{"event1": "AB", "result": 11, "other_key": "value1"} {"event1": "AB", "result": 10, "other_key": "value2"} {"event1": "BB", "result": 10, "other_key": "value3"}
我们可以逐行读取文件,每行单独解析为JSON对象,提取需要的字段:
import json event_list = [] result_list = [] # 处理文件读取与解析 try: with open("your_file.json", "r", encoding="utf-8") as f: for line_num, line in enumerate(f, 1): # 跳过空行(如果有的话) line = line.strip() if not line: continue try: json_obj = json.loads(line) # 提取指定字段(你说结构精确,所以直接取键) event_list.append(json_obj["event1"]) result_list.append(json_obj["result"]) except json.JSONDecodeError as e: print(f"第{line_num}行JSON解析失败: {e}") except KeyError as e: print(f"第{line_num}行缺少指定字段: {e}") except FileNotFoundError: print("错误:指定的文件不存在!") except PermissionError: print("错误:没有读取该文件的权限!") except Exception as e: print(f"发生未知错误: {e}") # 输出配对结果 print("event1列表:", event_list) print("result列表:", result_list)
情况2:连续无分隔的JSON对象
如果你的文件是没有换行的连续JSON(比如{"event1":"AB","result":11}{"event1":"AB","result":10}{"event1":"BB","result":10}),咱们可以用json.JSONDecoder的raw_decode方法来逐个解析:
import json event_list = [] result_list = [] try: with open("your_file.json", "r", encoding="utf-8") as f: data = f.read() decoder = json.JSONDecoder() pos = 0 while pos < len(data): try: json_obj, pos = decoder.raw_decode(data, pos) event_list.append(json_obj["event1"]) result_list.append(json_obj["result"]) # 跳过可能的空白字符(比如空格、换行) pos = data.find('{', pos) if pos == -1: break except json.JSONDecodeError as e: print(f"在位置{pos}处解析失败: {e}") break except FileNotFoundError: print("错误:指定的文件不存在!") except PermissionError: print("错误:没有读取该文件的权限!") except Exception as e: print(f"发生未知错误: {e}") print("event1列表:", event_list) print("result列表:", result_list)
关键说明
- 不需要修改原文件:两种方法都是直接读取解析,完全不改动源文件内容,符合你的要求。
- 流解析优势:不管文件多大,都不会一次性把整个文件加载到内存,适合处理大文件。
- 异常处理:代码里覆盖了常见的文件问题(找不到文件、权限不足)和JSON解析问题(格式错误、字段缺失),你可以根据实际情况调整提示信息。
这样运行后,就能得到你想要的[AB, AB, BB]和[11,10,10]这样的配对列表啦!
内容的提问来源于stack exchange,提问作者Srikanth Gopalakrishnan
相关产品推荐
相关产品推荐

