Python glom со списком записей группирует общие уникальные идентификаторы client_ids вместе как ключ
Я только что обнаружил glom, и руководство имеет смысл, но я не могу понять, какую спецификацию использовать для записей Chrome BrowserHistory.json для создания структуры данных, сгруппированных по client_id, или даже если это правильное использование glom. Я думаю, что могу добиться этого, используя другие методы, перебирая json в цикле, но я надеялся узнать больше о glom и его возможностях.
В json есть Browser_History со списком для каждой записи истории следующим образом:
{
"Browser_History": [
{
"favicon_url": "https://www.google.com/favicon.ico",
"page_transition": "LINK",
"title": "Google Takeout",
"url": "https://takeout.google.com",
"client_id": "abcd1234",
"time_usec": 1424794867875291
},
...
Мне нужна структура данных, в которой все сгруппировано по client_id, например, с client_id в качестве ключа к списку dicts, например:
{ 'client_ids' : {
'abcd1234' : [ {
"title" : "Google Takeout",
"url" : "https://takeout.google.com",
...
},
...
],
'wxyz9876' : [ {
"title" : "Google",
"url" : "https://www.google.com",
...
},
...
}
}
Подходит ли для этого glom? Я играл с ним и читал, но, похоже, я не могу правильно понять спецификацию, чтобы выполнить то, что мне нужно. Лучшее, что у меня есть без ошибок:
with open(history_json) as f:
history_list = json.load(f)['Browser_History']
spec = {
'client_ids' : ['client_id']
}
pprint(glom(data, spec))
который дает мне список всех client_ids, но я не могу понять, как сгруппировать их вместе как ключи, а не иметь их как большой список. любая помощь будет оценена, спасибо!
1 ответ
Это должно сработать, хотя я не уверен, что это самый «глоумный» способ добиться этого.
import glom
grouping_key = "client_ids"
def group_combine (existing,incoming):
# existing is a dictionary used for accumulating the data
# incoming is each item in the list (your input)
if incoming[grouping_key] not in existing:
existing[incoming[grouping_key]] = []
if grouping_key in incoming:
existing[incoming[grouping_key]].append(incoming)
return existing
data ={ 'Browser_History': [{}] } # your data structure
fold_spec = glom.Fold(glom.T,init = dict, op = group_combine )
results = glom.glom(data["Browser_History"] ,{ grouping_key:fold_spec })