求助:MongoDB单行JSON文档转Pandas DF/CSV操作是否正确
把MongoDB每行JSON文档转成Pandas DataFrame/CSV的正确姿势
嘿,我来帮你搞定这个转换问题!你手动给每行加逗号、把整个文档包在[]里的思路其实是对的——本质是把零散的JSON对象转成一个JSON数组,这样json.loads能解析,但手动操作很容易踩坑(比如最后一行多加个逗号就会导致语法错误),不如用更高效可靠的方法,我给你分几种情况讲:
方法一:直接用Pandas读取(推荐!)
Pandas本身就支持读取每行一个JSON对象的文件,完全不用手动修改原文档,一行代码搞定:
import pandas as pd # 读取每行是独立JSON的文件,自动转为DataFrame df = pd.read_json('你的MongoDB文档文件名.json', lines=True) # 转成CSV保存(index=False去掉自动生成的索引列) df.to_csv('输出文件名.csv', index=False)
这个方法的好处是:
- 不用碰原文件,避免手动修改带来的语法错误
- 自动处理每行的JSON解析,哪怕文件很大也能高效处理
- 如果有嵌套的JSON字段,Pandas会默认存为
object类型,后续可以用json_normalize展开(后面会讲)
方法二:如果你已经手动修改了文件(加了[]和逗号)
要是你已经把文件改成了JSON数组格式,记得检查最后一个JSON对象后面不要加逗号!正确的格式应该是这样:
[
{"id" : "12345id" , "price" : 202.4, "order_id" : "bc2341"},
{"id" : "67890id" , "price" : 180.5, "order_id" : "ef6789"}
]
如果最后一行多了逗号(比如},]),json.loads会直接报错。确认格式正确后,用下面的代码转换:
import json import pandas as pd # 读取修改后的JSON数组文件 with open('修改后的文件名.json', 'r', encoding='utf-8') as f: json_data = json.load(f) # 转成DataFrame df = pd.DataFrame(json_data) # 保存为CSV df.to_csv('输出文件名.csv', index=False)
进阶:处理嵌套JSON字段
如果你的MongoDB文档里有嵌套的结构(比如某个字段是子JSON),可以用json_normalize把嵌套字段展开成单独的列:
import json from pandas import json_normalize # 逐行读取原JSON文件,解析成Python列表 with open('你的MongoDB文档文件名.json', 'r', encoding='utf-8') as f: data = [json.loads(line.strip()) for line in f if line.strip()] # 展开嵌套字段生成DataFrame df = json_normalize(data) # 保存CSV df.to_csv('展开后的输出.csv', index=False)
处理超大型文件
如果你的文件特别大,内存装不下,可以用Pandas的分块读取功能:
import pandas as pd # 每次读取10000行,避免内存溢出 chunk_size = 10000 chunk_list = [] # 逐块读取并处理 for chunk in pd.read_json('超大型文件.json', lines=True, chunksize=chunk_size): chunk_list.append(chunk) # 合并所有块成一个DataFrame df = pd.concat(chunk_list, ignore_index=True) # 保存CSV df.to_csv('大型文件输出.csv', index=False)
总结一下:优先用方法一,既省事又不容易出错;手动修改文件的话一定要注意JSON数组的语法正确性;遇到嵌套结构或者超大型文件,用对应的进阶方法就好~
内容的提问来源于stack exchange,提问作者Aleksey Vinokurov
相关产品推荐
相关产品推荐

