如何移除字符串中换行符、转义引号并转换为JSON或Python字典
3GB量级转义JSON字符串转Python字典/标准JSON最优方案
你的待处理数据为外层包裹双引号、内部转义的*行分隔JSON(JSON Lines)格式,3GB量级属于大文件处理范畴,必须采用流式处理方案,避免一次性加载文件到内存。
实现方案
核心逻辑
无需手动处理转义引号,Python内置/第三方JSON解析库原生支持转义字符识别,核心流程:
- 流式读取文件,按4MB左右的块大小迭代读取,降低内存占用
- 去除外层多余的包裹双引号,按换行拆分单条JSON对象
- 单条解析后直接走业务逻辑,不需要累积所有结果
最优性能实现代码
优先选择orjson库做解析,相比标准库json性能提升2~3倍,内存占用降低30%以上,示例代码:
# 先安装orjson:pip install orjson import orjson def stream_parse_big_file(file_path: str, chunk_size: int = 4 * 1024 * 1024): buffer = "" with open(file_path, "r", encoding="utf-8") as f: # 跳过开头的外层包裹双引号 first_char = f.read(1) if first_char != '"': buffer += first_char while True: chunk = f.read(chunk_size) if not chunk: break buffer += chunk # 拆分已读取的完整JSON行 while "\n" in buffer: line, buffer = buffer.split("\n", 1) # 去除行尾可能带的外层双引号 cleaned_line = line.rstrip('"').strip() if not cleaned_line: continue try: # 自动处理转义引号,直接得到Python字典 json_item = orjson.loads(cleaned_line) yield json_item except orjson.JSONDecodeError as e: print(f"行解析失败,前100字符:{cleaned_line[:100]},错误:{str(e)}") # 处理缓冲区剩余内容 if buffer.strip(): cleaned_buffer = buffer.rstrip('"').strip() if cleaned_buffer: try: yield orjson.loads(cleaned_buffer) except orjson.JSONDecodeError as e: print(f"末尾内容解析失败:{str(e)}") # 业务调用示例 if __name__ == "__main__": for item in stream_parse_big_file("your_data_file.txt"): # 此处写你的业务逻辑,比如写入数据库、导出为标准JSONL文件等 print(item["domain"], item["categories"])
避坑注意事项
- 不要手动做
\"替换为"的操作,多余且容易引入额外转义问题,JSON解析库原生支持识别转义字符 - 不要调用
read()、readlines()等一次性加载全文件的方法,3GB文件会直接占满可用内存 - 如果你的单条JSON内部本身包含转义换行符
\n,不要按\n拆分行,改用ijson库做流式JSON结构解析即可
内容的提问来源于stack exchange,提问作者Jeet Patel
相关产品推荐
相关产品推荐

