JSON(JavaScript Object Notation, JS 物件標記) 是一種輕量級的資料交換格式,JSON的資料格式其實就是python里面的字典格式,里面可以包含方括號括起來的陣列,也就是python里面的串列,在python中,有專門處理json格式的模塊—— json 和 picle模塊,Json 模塊提供了四個方法: dumps、dump、loads、load,pickle 模塊也提供了四個功能:dumps、dump、loads、load,
json模塊:
json.dumps():對資料進行編碼;只完成了序列化為str, json.loads():對資料進行解碼;只完成了反序列化, json.dump():對資料進行編碼;必須傳檔案描述符,將序列化的str保存到檔案中,(處理的是檔案而不是字串) json.load():對資料進行解碼;只接收檔案描述符,完成了讀取檔案和反序列化,(處理的是檔案而不是字串)
查看原始碼區別:
# dumps原始碼 def dumps(obj, skipkeys=False, ensure_ascii=True, check_circular=True, allow_nan=True, cls=None, indent=None,separators=None,default=None, sort_keys=False, **kw): """ Serialize ``obj`` to a JSON formatted ``str``. # 序列號 “obj” 資料型別 轉換為 JSON格式的字串""" # dump原始碼 def dump(obj, fp, skipkeys=False, ensure_ascii=True, check_circular=True, allow_nan=True, cls=None, indent=None, separators=None,default=None, sort_keys=False, **kw): """Serialize ``obj`` as a JSON formatted stream to ``fp`` (a``.write()``-supporting file-like object). # 有兩個動作,一個動作是將”obj“轉換為JSON格式的字串,還有一個動作是將字串寫入到檔案中,也就是說檔案描述符fp是必須要的引數 """ # loads原始碼 def loads(s, encoding=None, cls=None, object_hook=None, parse_float=None, parse_int=None, parse_constant=None, object_pairs_hook=None, **kw): """Deserialize ``s`` (a ``str`` instance containing a JSON document) to a Python object. # 將包含str型別的JSON檔案反序列化為一個python物件""" # load原始碼 def load(fp, cls=None, object_hook=None, parse_float=None, parse_int=None, parse_constant=None, object_pairs_hook=None, **kw): """Deserialize ``fp`` (a ``.read()``-supporting file-like object containing a JSON document) to a Python object. # 將一個包含JSON格式資料的可讀檔案飯序列化為一個python物件"""
代碼演示示例:
json.dumps():Python 資料型別轉換為 JSON 物件
1 import json 2 3 json.dumps([]) # dumps可以格式化所有的基本資料型別為字串 4 # '[]' 5 6 json.dumps(1) # 數字 7 # '1' 8 9 json.dumps('1') # 字串 10 # '"1"' 11 12 dict = {"name":"Tom", "age":23} 13 json.dumps(dict) # 字典 14 # '{"name": "Tom", "age": 23}'
json.dump():寫入 JSON 資料
1 a = {"name":"Tom", "age":23} 2 with open("test.json", "w", encoding='utf-8') as f: 3 json.dump(a,f,indent=4) # 和f.write(json.dumps(a, indent=4))效果一樣;indent格式化保存字典,默認為None,小于0為零個空格
json.loads():將 JSON 物件轉換為 Python 字典
1 json.loads('{"name":"Tom", "age":23}') 2 # {'age': 23, 'name': 'Tom'}
json.load():讀取資料
1 with open('data.json', 'r') as f: 2 data = https://www.cnblogs.com/bonheur/p/json.load(f) # 和 json.loads(f.read())效果相同
Python 編碼為 JSON 型別轉換對應表:
| Python | JSON |
|---|---|
| dict | object |
| list, tuple | array |
| str | string |
| int, float, int- & float-derived Enums | number |
| True | true |
| False | false |
| None | null |
JSON 解碼為 Python 型別轉換對應表:
| JSON | Python |
|---|---|
| object | dict |
| array | list |
| string | str |
| number (int) | int |
| number (real) | float |
| true | True |
| false | False |
| null | None |
pickle 模塊:
json模塊和picle模塊都有 dumps、dump、loads、load四種方法,而且用法一樣,不用的是json模塊序列化出來的是通用格式,其它編程語言都認識,就是普通的字串,而picle模塊序列化出來的只有python可以認識,其他編程語言不認識的,表現為亂碼,不過picle可以序列化函式,但是其他檔案想用該函式,在該檔案中需要有該檔案的定義(定義和引數必須相同,內容可以不同),
物件序列化和反序列化(鈍化和活化) ,序列化(鈍化):記憶體中的物件如果想要被執行存盤起來,可通過序列化機制(將物件碾碎,變為散裝資料\二進制資料),持久存盤到檔案的某個位置;反序列化(活化):將檔案中的散裝物件,反序列化到程式中,還原成為一個物件物體
pickle模塊的介紹:(就是用來序列化和反序列化的)
函式:
1).pickle.dump(obj, fr):將obj物件序列化到檔案中(取決于fr中的path) # 沒有回傳值
2).pickle.load(fw):將fw(path中的資料)加載到程式,以物件回傳 # 有回傳值
【注意】:檔案物件不要忘記關閉!!!
使用pickle模塊演示物件序列化和反序列操作:
1 import pickle 2 3 class Person: 4 def __init__(self,name,age,sex): 5 self.name = name 6 self.age = age 7 self.sex = sex 8 def __str__(self): 9 return 'name:%s,age:%s,sex:%s' %(self.name,self.age,self.sex) 10 11 #實體化Person物件 12 p = Person('貂蟬',18,'女',162.0,84,'靚麗') 13 14 fw = open(r'person.txt','wb') #創建一個檔案person.txt,打開方式wb 15 #物件序列化操作:將程式中的物件p序列化到person.txt檔案中保存起來 16 pickle.dump(p,fw) 17 fw.close() 18 19 fr = open(r'person.txt','rb') #打開檔案person.txt 20 #物件反序列化操作:將person.txt中的二進制資料反序列化到程式中,還原成為一個Person物件 21 p1 = pickle.load(fr) 22 print(p1,type(p1)) 23 fr.close()
演示容器物件的序列化和反序列化操作:
1 # 有4個Person物件,我們可以先將它們存入到list中,然后將此list物件序列化到某一個檔案中,之后再將其反序列化到程式,還原得到一個list物件 2 per1 = Person('貂蟬',18,'女',162.0,84,'靚麗') 3 per2 = Person('西施',16,'女',160.0,80,'柔弱') 4 per3 = Person('昭君',19,'女',165.0,88,'清純') 5 per4 = Person('環環',23,'女',170.0,130,'肥美') 6 lt = [] 7 lt.append(per1) 8 lt.append(per2) 9 lt.append(per3) 10 lt.append(per4) 11 12 # 將lt物件序列化到檔案persons.txt中 13 fw = open(r'persons.txt','wb') 14 pickle.dump(lt,fw) 15 fw.close() 16 17 # 將persons.txt中的二進制資料反序列化到程式中 18 fr = open(r'persons.txt','rb') 19 lt1 = pickle.load(fr) 20 fr.close() 21 22 print(lt1) # 因為放進去的是物件,所以只能看到四個物件,看不到內容 23 # 回圈遍歷lt1,即可查看 24 for i in lt1: 25 print(i)
【總結】:
1. json序列化方法: dumps:無檔案操作 dump:序列化+寫入檔案2. json反序列化方法: loads:無檔案操作 load: 讀檔案+反序列化 3. json模塊序列化的資料更通用 pickle模塊序列化的資料僅python可用,但功能強大,可以序列號函式 4. json模塊可以序列化和反序列化的資料型別見python物件(obj) 與json物件的對應關系表 5. 格式化寫入檔案利用 indent = 4
【簡單補充】:
對于python資料分析可能會使用到,將DataFrame型別資料轉換成json資料,
函式:pandas.to_json(orient)
代碼簡單演示轉換成的5種格式(了解一下):
1 import pandas as pd 2 3 df = pd.DataFrame([['a', 'b'], ['c', 'd']],index=['row 1', 'row 2'],columns=['col 1', 'col 2']) 4 5 df.to_json(orient='split') 6 # '{"columns":["col 1","col 2"],"index":["row 1","row 2"],"data":[["a","b"],["c","d"]]}' 7 8 df.to_json(orient='records') 9 # '[{"col 1":"a","col 2":"b"},{"col 1":"c","col 2":"d"}]' 10 11 df.to_json(orient='index') 12 # '{"row 1":{"col 1":"a","col 2":"b"},"row 2":{"col 1":"c","col 2":"d"}}' 13 14 df.to_json(orient='columns') 15 # '{"col 1":{"row 1":"a","row 2":"c"},"col 2":{"row 1":"b","row 2":"d"}}' 16 17 df.to_json(orient='values') 18 # '[["a","b"],["c","d"]]' 19 20 df.to_json(orient='table') 21 # '{"schema": {"primaryKey":["index"],"fields":[{"name":"index","type":"string"},{"name":"col 1","type":"string"},{"name":"col 2","type":"string"}],"pandas_version":"0.20.0"},"data": [{"index":"row 1","col 1":"a","col 2":"b"},{"index":"row 2","col 1":"c","col 2":"d"}]}'
orient的值:split 將索引總結到索引,列名到列名,資料到資料,將三部分都分開了了;records 以columns:values的形式輸出;index 以index:{columns:values}...的形式輸出;colums 以columns:{index:values}的形式輸出;values 直接輸出值;table形式,
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/187946.html
標籤:Python
