如何修改Python脚本将多条或全部JSON对象导出为CSV?
解决CSV导出多条记录的问题
问题原因
你当前的代码在循环里每次调用normal_json.to_csv()时,默认会覆盖已有文件,所以最终CSV里只剩最后一条记录。
方案一:收集所有数据后统一导出(推荐)
先创建一个空列表,把每条记录处理后的DataFrame添加进去,循环结束后合并所有数据,再一次性导出到CSV。这样能保证数据结构一致,还能避免重复写入表头。
修改后的完整代码:
import pandas as pd from openpyxl.workbook import Workbook import csv from pathlib import Path from pandas.io.json import json_normalize import json from datetime import datetime from datetime import date from datetime import timedelta import psycopg2 from psycopg2 import OperationalError # Import our files import pg # Various functions to interface with the Postgres servers from db_creds import * # The DB server and user creds # Connect to an existing database connection = pg.create_connection(sourceDB_setting[3], sourceDB_setting[5], sourceDB_setting[6], sourceDB_setting[1], sourceDB_setting[2]) # Create a cursor to perform database operations cursor = connection.cursor() cursor.execute("SELECT application_data, id FROM ssap_applications LIMIT 10;") results = cursor.fetchall() # 创建空列表存储所有处理后的DataFrame all_records = [] for row in results: jrec, app_id = row jrec = json.loads(jrec) normal_json = pd.json_normalize(jrec) # 可选:把原记录的id加入DataFrame,方便对应溯源 normal_json['app_id'] = app_id print(normal_json) # 将当前记录的DataFrame加入列表 all_records.append(normal_json) # 合并所有DataFrame,重置索引 combined_df = pd.concat(all_records, ignore_index=True) # 一次性导出到CSV combined_df.to_csv('App_data2.csv', index=False, encoding='utf-8') cursor.close() connection.close() # 记得关闭数据库连接,避免资源浪费
方案二:追加模式写入CSV
如果不想合并DataFrame,可以用mode='a'(追加模式),但要注意只有第一次写入时添加表头,后续写入跳过表头。
修改后的循环部分代码:
# 标记是否为第一次写入,控制表头输出 first_write = True for row in results: jrec, app_id = row jrec = json.loads(jrec) normal_json = pd.json_normalize(jrec) normal_json['app_id'] = app_id print(normal_json) # 写入CSV:第一次写表头,后续不写 normal_json.to_csv('App_data2.csv', index=False, encoding='utf-8', mode='a', header=first_write) # 第一次写入后,切换标记 first_write = False
额外提示
- 要是所有JSON记录结构不一致,合并后会出现空值列,需要提前处理结构差异。
- 要导出全部记录,直接删掉SQL语句里的
LIMIT 10就行。 - 务必关闭数据库连接,避免占用数据库资源。
内容的提问来源于stack exchange,提问作者Anna Nguyen
相关产品推荐
相关产品推荐

