python 讀取與存儲json
- 2020 年 1 月 13 日
- 筆記
官方文檔:http://python3-cookbook.readthedocs.io/zh_CN/latest/c06/p02_read-write_json_data.html
JSON(JavaScript Object Notation) 是一種輕量級的數據交換格式。它基於ECMAScript的一個子集。 JSON採用完全獨立於語言的文本格式,但是也使用了類似於C語言家族的習慣(包括C、C++、Java、JavaScript、Perl、Python等)。這些特性使JSON成為理想的數據交換語言。易於人閱讀和編寫,同時也易於機器解析和生成(一般用於提升網路傳輸速率)。
JSON在python中分別由list和dict組成。
這是用於序列化的兩個模組:
- json: 用於字元串和python數據類型間進行轉換
- pickle: 用於python特有的類型和python的數據類型間進行轉換
- Json模組提供了四個功能:dumps、dump、loads、load
json dumps
把數據類型轉換成字元串 dump
把數據類型轉換成字元串並存儲在文件中 loads把字元串轉換成數據類型 load
把文件打開從字元串轉換成數據類型
json
是可以在不同語言之間交換數據的,而pickle
只在python
之間使用。json
只能序列化最基本的數據類型,josn
只能把常用的數據類型序列化(列表、字典、列表、字元串、數字、),比如日期格式、類對象!josn
就不行了。而pickle可以序列化所有的數據類型,包括類,函數都可以序列化。
import json # Writing JSON data with open('data.json', 'w') as f: json.dump(data, f) # Reading data back with open('data.json', 'r') as f: data = json.load(f)
字典排序
問題
你想創建一個字典,並且在迭代或序列化這個字典的時候能夠控制元素的順序。
解決方案
為了能控制一個字典中元素的順序,你可以使用 collections 模組中的 OrderedDict 類。 在迭代操作的時候它會保持元素被插入時的順序,示例如下:
from collections import OrderedDict d = OrderedDict() d['foo'] = 1 d['bar'] = 2 d['spam'] = 3 d['grok'] = 4 # Outputs "foo 1", "bar 2", "spam 3", "grok 4" for key in d: print(key, d[key])
OrderedDict
內部維護著一個根據鍵插入順序排序的雙向鏈表。每次當一個新的元素插入進來的時候, 它會被放到鏈表的尾部。對於一個已經存在的鍵的重複賦值不會改變鍵的順序。
需要注意的是,一個 OrderedDict
的大小是一個普通字典的兩倍,因為它內部維護著另外一個鏈表。 所以如果你要構建一個需要大量 OrderedDict
實例的數據結構的時候(比如讀取 100,000 行 CSV
數據到一個 OrderedDict
列表中去), 那麼你就得仔細權衡一下是否使用 OrderedDict
帶來的好處要大過額外記憶體消耗的影響。
# from collections import ChainMap # # dict(index=0,name='none',width=0,height=0,bbox=str([0,0,0,0]),gender='none',age=0,mask='none',glass='none',hat='none') # jsonDefault=dict(bbox=str([0,0,0,0]),gender='male',age=0,mask='none',glass='none',hat='none') # # name:文件名str,width:圖片寬int,height:圖片高int,bbox:str([0,1,2,3]), # # gender:"male"|"female",glass:"sunglasses"|"glasses"|"none",age:年齡值int,hat:"Yes"|"No", # jsonTemp=lambda args:'''{{"image_key":"{name}","video_name":"1","video_index":"{index}","width":{width},"height":{height},"face":[{{"id":1,"track_id":-1,"data":{bbox},"struct_type":"rect","attrs":{{"gender":"{gender}","has_glasses":"{glass}","specific_age":"{age}","has_mask":"none","Wear_a_hat":"{hat}","occlusion":"{asvisible}"}}}}]}} # '''.format(**ChainMap(args,jsonDefault)) # # 為什麼不使用json標準的空值:null from collections import ChainMap # dict(index=0,name='none',width=0,height=0,bbox=str([0,0,0,0]),gender='none',age=0,mask='none',glass='none',hat='none') jsonDefault=dict(bbox=str([0,0,0,0]),gender='male',age=0,mask='none',glass='none',hat='none') # name:文件名str,width:圖片寬int,height:圖片高int,bbox:str([0,1,2,3]), # gender:"male"|"female",glass:"sunglasses"|"glasses"|"none",age:年齡值int,hat:"Yes"|"No", jsonTemp=lambda args:'''{{"image_key":"{name}","video_name":"1","video_index":"{index}","width":{width},"height":{height},"face":[{{"id":1,"track_id":-1,"data":"none","struct_type":"rect","attrs":{{"gender":"{gender}","has_glasses":"none","specific_age":"{age}","has_mask":"none","Wear_a_hat":"none","occlusion":"none","ignore":"no"}}}}]}} '''.format(**ChainMap(args,jsonDefault)) # 為什麼不使用json標準的空值:null # 基礎 轉換結果至指定json格式 def toJson(re_fileName): result = [] for j, cur_line in enumerate(open(re_fileName).readlines()): (ind,sex,age,mask,glass,sunglass,hat,img) = (i.strip() for i in cur_line.strip().split('t')) form=dict(index=int(float(ind)),name=img,width=72,height=72,gender='male' if int(float(sex))==1 else 'female',age=int(float(age))) result.append(jsonTemp(form)) return result re_fileName = 'filename.lst' ipc_train_result=toJson(re_fileName) with open('filename.json','w+') as f: for i in ipc_train_result: f.write(i)