背景:
我有一個大型 JSON 檔案(數十 GB),其中檔案的每一“行”都是一個日志條目(也是 JSON 格式)。日志來自多個不同的來源,因此一個日志中的欄位可能會或可能不會出現在任何其他日志中。換句話說,JSON 格式的“鍵”,以及鍵相互嵌套的程度,在日志之間是不一致的。
我的目標:
我需要能夠找到任何給定日志中的所有鍵[已經完成],并跟蹤哪些鍵嵌套在其他鍵下[這是我尚未解決的部分]。
到目前為止我的作業:
由于檔案的大小,我無法一次將檔案全部加載到記憶體中,所以我一直在逐行檢查它(逐個日志)。我已經編輯了實際內容,但假設檔案的第一行(日志)如下所示:
{'foo': {'bar': 'data',
'biz': 'data'},
'baz': 'data',
'qux': {'quux': 'data',
'quuz': 'data'},
'corge': {'grault': {'garply': 'data'},
'waldo': {'fred': 'data',
'plugh': 'data'},
'xyzzy': 'data'},
'thud': 'data'}
我一直在使用這個代碼...
def find_nested_dicts(d):
for k,v in d.items():
KEYS.append(k)
if isinstance(d[k], dict):
find_nested_dicts(d[k])
return KEYS
KEYS=[]
with open(full_geodata_path, "r") as f:
next_line = f.readline()
next_line_json = json.loads(next_line)
output = find_nested_dicts(next_line_json)
...產生這個:
output = [
'foo',
'bar',
'biz',
'baz',
'qux',
'quux',
'quuz',
'corge',
'grault',
'garply',
'waldo',
'fred',
'plugh',
'xyzzy',
'thud'
]
我不喜歡KEYS
用作全域變數,但我無法讓它在本地作業。
請注意,每個鍵附加到此串列的順序很重要。鍵的名稱很少有任何指示它們嵌套在哪個父鍵下的內容。換句話說,我有意撰寫代碼,以便將鍵以output
與它們以 JSON 格式顯示的順序相同的順序附加到串列中。
上面顯示的結果是我的目標的一半。但是,我希望能夠生成一個包含每個鍵的串列,以及檢索它的嵌套深度。我正在嘗試構建一個如下所示的串列:
output = [
('foo', 0),
('bar', 1),
('biz', 1),
('baz', 0),
('qux', 0),
('quux', 1),
('quuz', 1),
('corge', 0),
('grault', 1),
('garply', 2),
('waldo', 1),
('fred', 2),
('plugh', 2),
('xyzzy', 1),
('thud', 0)
]
這個函式可能是我得到的最接近的:
def find_nested_dicts(d, depth=0):
for k, v in d.items():
KEYS.append((k, depth))
depth = 1
if isinstance(v, dict):
find_nested_dicts(v, depth)
else:
depth -= 1
return KEYS
這個嘗試的問題是這個函式只會導致“深度”計數器增加。
我嘗試將遞回映射到紙上,并嘗試以各種組合在and回圈中進出depth = 1
, depth -= 1
, andKEYS.append((k, depth))
陳述句,以期獲得更好的結果。for
if
在這一點上,我不確定這是否是我自己無法完全概念化遞回,或者我正在嘗試做的事情是否真的可以用普通的 python。非常感謝任何見解。
最后一點,我沒有嘗試解決此問題的計算機的管理員權限,并且無法從我的個人計算機訪問此資料。從以前的專案中,我知道我有以下庫可供使用:
import numpy as np
import os
import pandas as pd
import json
import itertools
from collections import Counter
import matplotlib.pyplot as plt
uj5u.com熱心網友回復:
def foo(d, arr, n):
if isinstance(d, dict):
for k in d.keys():
arr.append((k, n))
foo(d[k], arr, n 1)
ans = []
foo(data, ans, 0)
ans
# [('foo', 0),
# ('bar', 1),
# ('biz', 1),
# ('baz', 0),
# ('qux', 0),
# ('quux', 1),
# ('quuz', 1),
# ('corge', 0),
# ('grault', 1),
# ('garply', 2),
# ('waldo', 1),
# ('fred', 2),
# ('plugh', 2),
# ('xyzzy', 1),
# ('thud', 0)]
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/470057.html
上一篇:如何使用Python獲取運算式的所有可能的括號組合?
下一篇:在Ocaml中跟蹤嵌套遞回