Python中使用类/对象实现JSON转CSV的方案、效率对比及后续指引
通过类/对象实现JSON转CSV的可行性
这个路径是完全可行的,属于Python里非常常规的实现方式,哪怕不依赖pandas这类第三方库,也能完成全流程的转换。
不同转换方案的效率对比
不要迷信自定义类方案一定比pandas快,两种方案的效率高低完全取决于实现细节:
- 常规pandas方案(
pd.read_json读取→转成DataFrame→to_csv导出)的核心优化来自底层C语言实现,处理几十MB以内的小JSON文件时速度很快,但它默认会把全量数据加载到内存里,碰到几百MB甚至更大的JSON文件时,很容易因为内存不足崩溃。 - 你目前走的「JSON解析后映射为自定义类对象列表」的方案,效率分两种情况:
- 如果你是把整个JSON一次性全部解析成类对象、全存在内存里,那纯Python实现的版本大概率比pandas慢,内存占用也更高——因为Python类实例的存储是碎片化的,远不如pandas底层连续内存块的存储效率高。
- 如果你是逐行/逐块读取JSON内容,每解析完一块就生成类实例、处理完直接写入CSV,不把所有数据全存在内存里,那处理大JSON时的内存占用会远低于pandas全量加载的方案,整体运行稳定性也更高,不会轻易出现内存溢出的问题。
已生成类对象列表后的操作步骤
全程不需要重新读取原始JSON文件,按下面的步骤走就行,新手也能快速搞定:
- 先梳理需要导出的CSV列:把你类里需要落到CSV的属性全部列出来,定好顺序,避免导出的时候列错位。比如你的自定义类是用来存书籍信息的,核心属性是
book_id、title、price,那CSV的列就按这个顺序排就行。 - 选择适配你场景的导出工具,不用折腾复杂逻辑:
- 方案1:用Python原生
csv模块,零第三方依赖,轻量稳定,适合不想装额外包的场景
示例代码(覆盖新手易踩的坑):
小提示:用import csv # 提前定好CSV的列名和顺序 csv_columns = ["book_id", "title", "price"] # 替换成你自己写类生成的对象列表 my_obj_list = [book_obj1, book_obj2, book_obj3] # 打开输出的CSV文件 # newline=""是避免Windows下写出的CSV出现空行的经典坑 # utf-8-sig编码能保证用Excel打开中文内容不会乱码 with open("book_data.csv", "w", newline="", encoding="utf-8-sig") as csv_file: writer = csv.DictWriter(csv_file, fieldnames=csv_columns) # 先写表头 writer.writeheader() # 遍历所有对象写内容 for obj in my_obj_list: # 新手简化技巧:不用手动把每个属性写成字典 # 用vars()直接把对象的内部属性转成匹配写入格式的字典 row_data = vars(obj) writer.writerow(row_data)vars()的时候要确保类的属性名和上面定的csv_columns完全一致,如果有属性不需要导出,写完之后手动从row_data里删掉就行。 - 方案2:如果你本地已经装了pandas,可以直接把现有对象列表转成DataFrame再导出,代码比自己写csv逻辑更短:
import pandas as pd # 把对象列表转成DataFrame,pandas会自动把每个对象的公共属性识别成列 df = pd.DataFrame(vars(obj) for obj in my_obj_list) # 导出CSV,index=False是避免第一列出现无意义的行号 df.to_csv("book_data.csv", index=False, encoding="utf-8-sig")
- 方案1:用Python原生
新手避坑提醒:如果你的类里某个属性是嵌套结构(比如存了字典、列表,或者是另一个类的实例),直接写入CSV的时候会把整个结构转成字符串存进去,看起来会非常乱。这部分需要在写每一行内容的时候,提前把嵌套的字段拆成平铺的字段,再写入CSV。
内容的提问来源于stack exchange,提问作者Grzegorz-so
相关产品推荐
相关产品推荐

