Skip to main content
 首页 » 编程设计

python之从复杂的 JSON 文件中提取信息的最有效方法是什么

2025年05月04日27傻小

我是 Python 的新手,正在研究从 dict 文件中提取某些信息。

我有数百万个存储文本数据的 JSON 文件。所有 JSON 文件都具有相似的结构。在结构方面有很多变化。对于每个 JSON 文件,我想从特定键中提取所有文本字符串并将它们存储为字典。

下面的

json1 和 json2 是简化的示例。我一直在做的是从 JSON 文件中提取样本,对其进行分析,编写大量 if 语句以尝试包含所有可能的变体。但是,我发现它效率低下并且仍然无法包含所有场景。我想知道是否有一种通用的方法可以使用键 "text" 搜索和提取值。

json1 = { 
        "section": { 
                   "heading":{"lvl":"A1", "text":"today"}, 
                   "paragraph":[ 
                                {"color":"green",  "text":"yesterday"}, 
                                {"color":"purple", "text":"tomorrow"} 
                               ] 
                   } 
         } 
 
json2 = { 
        "paragraph":{"text":"everyday", "color": "black"} 
        } 

换句话说,我想得到一个包含所有文本字符串的字典,键为“文本”。对于json1,我想获取{"json1":"today yesterday tomorrow"}。对于 json2,我想获取 {"json2":"everyday"}。

非常感谢任何帮助。

请您参考如下方法:

如果您什么都不知道,并且结构可能像您暗示的那样相当随意,那么您必须访问每个节点并进行检查。这可以使用递归以通用方式实现。这是一个实现它的快速而简单的函数:

In [4]: def extract_text(obj, acc): 
    ...:     if isinstance(obj, dict): 
    ...:         for k, v in obj.items(): 
    ...:             if isinstance(v, (dict, list)): 
    ...:                 extract_text(v, acc) 
    ...:             elif k == "text": 
    ...:                 acc.append(v) 
    ...:     elif isinstance(obj, list): 
    ...:         for item in obj: 
    ...:             extract_text(item, acc) 
...:        

以下是您将如何使用它:

In [5]: acc1 = [] 
 
In [6]: extract_text(json1, acc1) 
 
In [7]: acc1 
Out[7]: ['yesterday', 'tomorrow', 'today'] 
 
In [8]: acc2 = [] 
 
In [9]: extract_text(json2, acc2) 
 
In [10]: acc2 
Out[10]: ['everyday'] 

请注意,您的问题实际上与 JSON 没有任何关系,JSON 是一种基于文本的数据序列化格式。您已经在处理反序列化数据和 Python 数据结构。无论如何,如果您真的想要问题中的结果,您只需执行以下操作:

In [11]: {"json1": ",".join(acc1)} 
Out[11]: {'json1': 'yesterday,tomorrow,today'} 

或者任何你喜欢加入的分隔符,比如一个简单的空格:

In [12]: {"json1": " ".join(acc1)} 
Out[12]: {'json1': 'yesterday tomorrow today'}