我是 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'}
