Python:嘗試反序列化檔案中的多個JSON物件,每個物件跨越多個但一致的間隔數量的行
好的,經過近一個星期的研究,我打算給他一槍.我有一個文字檔案如下(顯示3個單獨的json物件作為一個例子,但檔案有這些的50K):
{ "zipcode":"00544", "current":{"canwc":null,"cig":7000,"class":"observation"}, "triggers":[178,30,176,103,179,112,21,20,48,7,50,40,57] } { "zipcode":"00601", "current":{"canwc":null,"cig":null,"class":"observation"}, "triggers":[12,23,34,28,100] } { "zipcode":"00602", "current":{"canwc":null,"cig":null,"class":"observation"}, "triggers":[13,85,43,101,38,31] }
我知道如何使用Python json庫來處理JSON物件,但是我對如何從讀取檔案建立5萬個不同的json物件有一個挑戰. (也許我甚至沒有正確地考慮這個問題,但最終我需要反序列化和載入到一個資料庫)我已經嘗試了itertools認為我需要一個生成器,所以我能夠使用:
with open(file) as f: for line in itertools.islice(f, 0, 7): #since every 7 lines is a json object jfile = json.load(line)
但是上面顯然不會工作,因為它不是將7行作為一個單獨的json物件讀取,而且我也不知道如何在整個檔案中迭代並載入個別的json物件.
以下將給我一個列表我可以切片:
list(open(file))[:7]
任何幫助將非常感激.
非常接近我所需要的,我認為只有一步之遙,但仍然掙扎著一點點迭代.這將最終讓我對所有資料幀進行反覆列印,但是如何使其能夠捕獲一個巨大的資料幀,所有這些資料框都是基本連線的?那麼我可以將最終的資料幀匯出到csv等(還有更好的方式將這個結果上傳到一個數據庫中,而不是先建立一個巨大的資料框?)
def lines_per_n(f, n): for line in f: yield ''.join(chain([line], itertools.islice(f, n - 1))) def flatten(jfile): for k, v in jfile.items(): if isinstance(v, list): jfile[k] = ','.join(v) elif isinstance(v, dict): for kk, vv in v.items(): jfile['%s' % (kk)] = vv del jfile[k] return jfile with open('deadzips.json') as f: for chunk in lines_per_n(f, 7): try: jfile = json.loads(chunk) pd.DataFrame(flatten(jfile).items()) except ValueError, e: pass else: pass
載入6個額外的行代替,並將該字串傳遞給json.loads():
with open(file) as f: for line in f: # slice the next 6 lines from the iterable, as a list. lines = [line] + list(itertools.islice(f, 6)) jfile = json.loads(''.join(lines)) # do something with jfile
json.load()將不僅僅是檔案中的下一個物件,而islice(f,0,7)將只讀取前7行,而不是讀取7行資料塊中的檔案.
您可以在生成器中包裝讀取大小為N的檔案:
from itertools import islice, chain def lines_per_n(f, n): for line in f: yield ''.join(chain([line], itertools.islice(f, n - 1)))
然後使用它來塊輸入檔案:
with open(file) as f: for chunk in lines_per_n(f, 7): jfile = json.loads(chunk) # do something with jfile
或者,如果你的塊變得長度不等,直到有分析結果為止:
with open(file) as f: for line in f: while True: try: jfile = json.loads(line) break except ValueError: # Not yet a complete JSON value line += next(f) # do something with jfile
http://stackoverflow.com/questions/20400818/python-trying-to-deserialize-multiple-json-objects-in-a-file-with-each-object-s