我想一张一张地加载我的json文件中的项目。该文件的最大容量为3gb,因此无法提前加载并循环播放。
我的json文件基本上是键和值对(数百对)的字典,并且没有要丢弃的内容(ijson)。
我只想一次加载一对。反正有这样做吗?
答案 0 :(得分:1)
好的,所以json是嵌套格式,这意味着每个重复块(字典或列表对象)都由开始和结束字符包围。通常,您读取了整个文件,这样做可以确认每个对象的格式正确,结构正确且“封闭”,换句话说,可以验证所有对象是否合法。当您使用json库将json文件加载到内存中时,该过程的一部分就是验证。
如果要对超大文件执行此操作,则必须放弃常规库并滚动自己的库,一次装入一行(或一块),并在验证将追溯成功的前提下进行处理。
这是可以实现的(假设您能够相信这种假设),但这可能是您必须编写自己的东西。
一种策略可能是一次读取一行,以冒号:
字符分隔,并用逗号作为记录定界符,这是对JSON中键值对编码方式的粗略近似。使用此方法,您将能够按顺序整洁地处理除第一个和最后一个键值对之外的所有键和值对。
这仅使您编写一些特殊条件来正确解析第一条记录和最终记录,而使用此策略会导致乱码。
然后粗心地调用类似这样的东西(引用csv
库)并将json当作一个巨大的,格式异常的csv文件。
import csv
with open('big.json', newline=',') as csv_json_franken_file:
jsonreader = csv.reader(csv_json_franken_file, delimiter=':', quotechar='"')
for row in jsonreader: # This bit reads in a "row" at a time, until finished
print(', '.join(row))
然后对第一行和最后一行(或多或少取决于json的结构)进行一些边缘情况处理,以修复由相当公然的黑客行为引起的乱码。它不干净,内容更改也不可靠-但有时,您只需要发挥自己的作用即可。
说实话,生成3GB大小的json文件是有点不负责任的,因此,如果有人来问这个问题,那您就快来了。
答案 1 :(得分:0)
为什么不一次用数据填充sqlite表并使用记录PK查询数据?参见https://docs.python.org/3.7/library/sqlite3.html
答案 2 :(得分:0)
所以基本上我在这个答案中发现了如何以一种非常简单的方式来做到这一点: https://stackoverflow.com/a/17326199/2933485
使用ijson,看来您可以循环加载文件而不加载文件,而是打开文件并对其使用ijson解析功能,这是我发现的示例:
import ijson
for prefix, the_type, value in ijson.parse(open(json_file_name)):
print prefix, the_type, value