Python 如何根据键的值拆分大型json文件?

Python 如何根据键的值拆分大型json文件?,python,json,Python,Json,我有一个很大的json文件,我想根据键“metadata”拆分它。记录的一个例子是 {"text": "The primary outcome of the study was hospital mortality; secondary outcomes included ICU mortality and lengths of stay for hospital and ICU. ICU mortality was defined as survival of a

我有一个很大的json文件,我想根据键“metadata”拆分它。记录的一个例子是

{"text": "The primary outcome of the study was hospital mortality; secondary outcomes included ICU mortality and lengths of stay for hospital and ICU. ICU mortality was defined as survival of a patient at ultimate discharge from the ICU and hospital mortality was defined as survival at discharge or transfer from our hospital.", "label": "conclusion", "metadata": "18982114"}
json文件中有许多记录,其中键“metadata”是“18982114”。如何提取所有这些记录并将其存储到单独的json文件中?理想情况下,我正在寻找一种解决方案,它不包括加载和循环文件,否则每次查询时都会非常麻烦。我认为使用shell命令可能是可行的,但不幸的是,我不是shell命令方面的专家……所以我非常感谢非循环快速查询解决方案,thx

==========================================================================

以下是该文件的一些示例(包含5条记录):


作业是使用元数据“18982114”快速检索记录的文本

使用json包将json对象转换为字典,然后使用存储在
元数据
键中的数据。以下是一个工作示例:

# importing the module 
import json 

# Opening JSON file 
with open('data.json') as json_file: 
    data = json.load(json_file) 

    # Print the type of data variable 
    print("Type:", type(data)) 

    # Print the data of dictionary 
    print("metadata: ", data['metadata']) 

您可以尝试以下方法:

import json


with open('data.json') as data_json: 
    data = json.load(data_json) 
MATCH_META_DATA = '18982114'
match_records = []
for part_data in data:
    if part_data.get('metadata') == MATCH_META_DATA:
        match_records.append(part_data)

让我们假设在
示例中有以下JSON内容。JSON

{
“1”:{“text”:“Some text 1.”,“label”:“xxx”,“metadata”:“18982114”},
“2”:{“文本”:“部分文本2.”,“标签”:“yyy”,“元数据”:“18982114”},
“3”:{“text”:“Some text 3.”,“label”:“zzz”,“metadata”:“something other”}
}
您可以执行以下操作:

#/usr/bin/env python
#-*-编码:utf-8-*-
导入json
# 1. 从文件中读取json内容
my_json=None
以open(“example.json”、“r”)作为文件:
my_json=json.load(文件)
# 2. 过滤内容
#如果不想创建新的json文件,可以使用列表而不是新字典
新的json_数据={}
对于my_json中的记录_id:
如果my_json[record_id][“metadata”]==str(18982114):
new_json_data[record_id]=my_json[record_id]
# 3. 使用过滤后的数据编写新的json
打开(“result.json”),“w”)作为文件:
dump(新的json数据,文件)
这将输出以下
result.json
文件:

{“1”:{“文本”:“某些文本1.”,“标签”:“元数据”:“18982114”},“2”:{“文本”:“某些文本2.”,“标签”:“元数据”:“18982114”}

有没有一种方法可以在不加载和循环整个文件的情况下执行此操作?因为这个文件大约有10GB大,所以我想知道是否存在使用shell命令来实现这一点的方法……那么您要问的不是python而是shell命令;您可以使用字符串shell操作,在元数据键上拆分对象,使用模式匹配,还有一种方法可以使用shell命令而不是在整个文件上循环?您应该处理文件中的数据,我认为您需要通过读取打开文件。如果您的文件很大,您需要读取部分数据,而不在整个文件上循环是否可行?因为我必须多次查询这个文件,在10 GB的文件上循环是很麻烦的…您可能需要查看
jq
jqawk
shell命令(否则您必须在python中实现json流解析,除非有一个库可以提供帮助…);请参阅和(请参阅选择运算符),您可以使用
jq--stream'获取所需记录的索引选择(长度==2)|选择([0][1]==“元数据”)|选择([1]==“18982114”)。[0][0]'示例.json
(或
jq.[]|选择(.metadata==“18982114”)。
如果不使用流媒体)。但是,我不确定如何使用它来获得相应的记录,也许可以将它与一些python结合起来。您能否共享一个足够大的示例文件来测试这一点?您只需要使用jq来获取“元数据”为“18982114”的所有记录?是的,没错,我会重新编辑问题并将示例文件放在那里,非常感谢您的关注!您显示的输入没有那么大。在内存中加载文件并处理需要多少记录时不应该出现问题?我有10 GB的数据,所以我不能在这里全部显示。。。
import json


with open('data.json') as data_json: 
    data = json.load(data_json) 
MATCH_META_DATA = '18982114'
match_records = []
for part_data in data:
    if part_data.get('metadata') == MATCH_META_DATA:
        match_records.append(part_data)