有几种方法可以更有效地做到这一点:
JSON 模块,然后进入 Pandas
您可以尝试使用 json 模块直接将 JSON 文件作为 JSON 对象(即读入 Python 字典)读取:
import json
import pandas as pd
data = json.load(open("your_file.json", "r"))
df = pd.DataFrame.from_dict(data, orient="index")
orient="index"根据 JSON 文件的形状/映射,可能需要使用。
使用 Python查看有关JSON 文件的深度教程。
直接使用熊猫
你说这个选项会给你一个内存错误,但是有一个选项可以帮助你解决这个问题。传递lines=True,然后使用参数指定在一个块中读取多少行chunksize。以下将返回一个您可以迭代的对象,并且每次迭代将只读取文件的 5 行:
df = pd.read_json("test.json", orient="records", lines=True, chunksize=5)
注意这里的 JSON 文件必须是records格式,这意味着每一行都是list like。这让 Pandas 知道它可以一次可靠地读取chunksize=5行。这是有关行分隔的 JSON 文件的相关文档。简而言之,该文件应该使用以下内容编写:df.to_json(..., orient="records", line=True).
Pandas 不仅为您抽象了一些手动部分,它还提供了更多选项,例如正确转换日期、指定每列的数据类型等。查看相关文档。
查看Pandas 用户指南文档中的一个小代码示例。
另一个节省内存的技巧 - 使用生成器
有一种很好的方法可以在任何给定时间仅将一个文件的内容保存在内存中,使用具有惰性求值的 Python 生成器。这是了解它们的起点。
在您的示例中,它可能如下所示:
import os
# Get a list of files
files = sorted(os.listdir("your_folder"))
# Load each file individually in a generator expression
df = pd.concat(pd.read_json(file, orient="index") for f in files, ...)
仅在读取所有文件后才进行连接。在我离开.... 的文档pd.concat在这里。