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

2024-09-28 19:33:16 发布

您现在位置:Python中文网/ 问答频道 /正文

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

我有数百万个存储文本数据的JSON文件。所有JSON文件都有类似的结构。在结构上有很多变化。对于每个JSON文件,我希望从一个特定的键中提取所有文本字符串,并将它们存储为dict

下面的json1json2是简化的示例。我一直在做的是从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"}
        }

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

非常感谢任何帮助。在


Tags: 文件字符串text文本jsontodaydicttomorrow
2条回答

如果您不知道其他任何东西,并且结构可以像您所暗示的那样相当随意,那么您必须访问每个节点并进行检查。这可以通过使用递归的通用方式来实现。下面是一个快速而肮脏的函数来实现它:

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)
...:       

以下是如何使用它:

^{pr2}$

注意,您的问题实际上与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'}

如果您对json文件的结构一无所知,我建议您将内容转储并在列表中搜索。一个快速的解决方法如下。它只假设'text'键对应于一个单词条目。在

import pickle
import json

# Open .json file
f = open("myjson.json")
# Load the content
info = json.load(f)
# Dump the content as a list of words
info_list = pickle.dumps(info).split('\n')
# Whenever you see a 'text', collect the second next item
texts = [info_list[i+2][1:] for i,a in enumerate(info_list) if a.find('text')>0]
# Output the result
print texts

每个json文件的输出变成:

^{pr2}$

相关问题 更多 >