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

X. *_*Shi 1 python json dictionary

我是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"}
        }
Run Code Online (Sandbox Code Playgroud)

换句话说,我希望得到一个包含所有文本字符串的字典,其中包含"text"键.因为json1,我想得到{"json1":"today yesterday tomorrow"}.因为json2,我想得到{"json2":"everyday"}.

任何帮助是极大的赞赏.

jua*_*aga 5

如果您不知道其他任何内容,并且您所暗示的结构可能相当随意,那么您必须访问每个节点并进行检查.这可以使用递归以通用方式实现.这是一个快速而肮脏的功能来实现它:

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)
...:       
Run Code Online (Sandbox Code Playgroud)

以下是如何使用它:

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']
Run Code Online (Sandbox Code Playgroud)

请注意,您的问题与JSON没有任何关系,JSON是一种基于文本的数据序列化格式.您已经在处理反序列化数据和python数据结构.无论如何,如果你真的想要你的问题所带来的结果,你可以简单地做:

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

或者您喜欢加入的任何分隔符,例如简单的空格:

In [12]: {"json1": " ".join(acc1)}
Out[12]: {'json1': 'yesterday tomorrow today'}
Run Code Online (Sandbox Code Playgroud)