[Python]json.load() v.s. json.loads()

Posted by John on 2020-01-16
Words 501 and Reading Time 2 Minutes
Viewed Times

前言

最近在用別人的open source時因為json檔案讀取的問題卡一段時間,去trace code下去發現原來是別人的專案裡面有用到json.loads(),它的用處跟我平常在用的json.load()不太一樣,所以在這裡紀錄一下。

問題描述

首先,json.load()是用來讀取整個檔案的,也就是說通常會先用open()去打開json檔案,然後把檔案讀進來,大概像下面這樣:

1
2
with open(fileneme, 'r') as f:
result=json.load(f)

不過如果是用json.loads()的時候,他會搭配檔案一次讀一行的動作,把該行字串當成json讀進來,用法如下:

1
2
3
with open(filename, 'r') as f:
for line in f:
result=json.loads(line)

不過使用json.loads()的時候檔案格式就必須一行是一個json structure,如果妳的json file長得像這樣就會讀取失敗:

{
"dataset":{
"train": {"type": "mnist", "data_set": "train", "layout_x": "tensor"},
"test": {"type": "mnist", "data_set": "test", "layout_x": "tensor"}
},
"train":{
"keep_model_in_mem":0,
"random_state":0,
"data_cache":{
"cache_in_disk":{
"default":1
},
"keep_in_mem":{
"default":0
},
"cache_dir":"/mnt/raid/fengji/gcforest/mnist/fg-tree500-depth100-3folds/datas"
}
}
...

我原本的json檔案就如上面這個格式一樣,不過在使用別人的tool時發現有問題,trace code下去才發現他是使用json.loads()去一行一行處理,與其去改別人的code倒不如把檔案格式改成符合要求的比較快速,在上網查詢後找到了解決方法如下:將上述的格式轉成只有一行的json structure即可

1
2
with open(filename, "r") as f:
cleaned = ''.join([item.strip() if item.strip() is not '' else '-split_here-' for item in f.readlines()]).split('-split_here-')

完畢,就john!

Reference


>