Python批量读取多个JSON汇总教程
用Python遍历文件夹批量读取多个JSON文件,合并成一个大列表或汇总成统计表,支持嵌套字段提取和错误跳过,附完整代码。
场景痛点
爬虫按页存了几百个JSON、日志系统按天输出JSON、导出的用户分群数据一个文件一个ID。手动打开每个文件复制粘贴不现实,想把它们合并成一张表做统计,或者汇总成一个总数。用Python遍历文件夹一把搞定。
用到的库
# 纯标准库即可,需要pandas汇总时才装
pip install pandas
完整代码
# 批量读取多个JSON文件并汇总
import os
import glob
import json
import pandas as pd
def load_all_json_from_folder(folder_path):
"""
遍历文件夹下所有.json文件,合并成一个大列表。
每个JSON根是list[dict],或者根是单个dict。
"""
files = sorted(glob.glob(os.path.join(folder_path, "*.json")))
print(f"找到 {len(files)} 个JSON文件")
all_records = []
for fp in files:
try:
with open(fp, "r", encoding="utf-8") as f:
data = json.load(f)
# 记录来源文件,方便回溯
source = os.path.basename(fp)
if isinstance(data, list):
for item in data:
item["_source"] = source
all_records.append(item)
elif isinstance(data, dict):
data["_source"] = source
all_records.append(data)
except Exception as e:
print(f" 跳过 {os.path.basename(fp)}:{e}")
print(f"共加载 {len(all_records)} 条记录")
return all_records
def summarize_records(records):
"""
用pandas做简单汇总:总数、按某个字段分组计数、按数值字段求和。
"""
if not records:
print("没有数据")
return
df = pd.DataFrame(records)
print("\n=== 汇总信息 ===")
print(f"总记录数:{len(df)}")
print(f"字段列表:{list(df.columns)}")
# 示例:如果有"城市"字段,按城市统计数量
if "city" in df.columns:
print("\n按城市分布:")
print(df["city"].value_counts())
# 示例:如果有"金额"字段,求和
for col in ["amount", "price", "金额"]:
if col in df.columns:
print(f"\n{col} 总和:{df[col].sum()}, 均值:{df[col].mean():.2f}")
return df
def main():
folder = "./json_logs"
records = load_all_json_from_folder(folder)
df = summarize_records(records)
# 合并结果存成CSV方便后续分析
if df is not None and len(df) > 0:
df.to_csv("json_summary.csv", index=False, encoding="utf-8-sig")
print("\n已导出汇总CSV:json_summary.csv")
if __name__ == "__main__":
main()
代码讲解
glob.glob批量找.json文件,sorted保证处理顺序稳定。- 每个文件读出来判断根类型:是list就逐条加来源后追加,是dict就包一层追加。
- 每个记录加
_source字段,后面发现数据异常能定位到原始文件。 try/except包住单个文件,一个坏文件不影响其他文件处理。- 汇总阶段用pandas,
value_counts分组计数、sum/mean数值聚合,几行出统计结果。
运行结果
控制台打印找到多少个JSON、成功加载多少条、跳过几个坏文件、各字段统计。当前目录生成 json_summary.csv,包含所有JSON合并后的扁平数据,多了一列 _source 标记来源。
注意事项
- JSON文件命名带时间戳时,
sorted()自然按时间排序,方便按时间序列分析。 - 各文件字段不一致时,pandas会自动对齐,缺的列填NaN。
- 文件总量很大时,不要一次性把所有dict放内存,边读边写CSV或用chunksize思路。
- 解析报错先单独打开那个文件检查是不是被截断了,
json.tool可以校验。

更新时间:2026-09-14 21:05:06