內容簡述:
- 1、json模組
- 2、pickle模組
- 3、hashlib模組
- 4、base64模組
1、json模組
Json是一種輕量級的資料交換格式,在日常開發中經常需要從Json字串中提取資料,或者把資料轉換為Json字串,Python中內建了一個
json模組
來處理Json資料。json模組提供了下述四個函式來完成相互轉換:
- json.load():Json轉字典,接受包含json資料的檔案物件。
- json.loads():Json轉字典,接受json字串,而非檔案物件。
- json.dump():字典轉Json,第一個引數為物件字典,第二個引數為檔案物件,直接寫入檔案。
- json.dumps():字典轉Json,第一個引數為物件字典。
dump和dumps還有下述這些常用的可選引數:
- ensure_ascii:預設True,保證轉換後的json全是ascii字元,非ascii字元都會被轉義。
如果資料中包含中文或非ascii字元,最好將ensure_ascii設定為False,保證輸出結果正常。- indent:縮排,預設None,沒有縮排,設定為正整數,輸出格式會按指定的半形空格數縮排。
- separators:設定分隔符,預設分隔符為(,和:)
- sort_keys:預設False,輸出結果是否按照字典中的key進行排序。
使用程式碼程式碼示例如下:
import json
json_str = """
{
"code": "200",
"data": [
{
"create_time": "2小時前",
"id": 3,
"title": "對話董明珠:這個時代要倡導利他思想",
"url": "https://www.thepaper.cn/newsDetail_forward_3131849"
}
],
"msg": "請求成功"
}
"""
if __name__ == '__main__':
# Json字串轉字典
print(json.loads(json_str))
# 解析一個Json檔案轉字典
with open('test.json', 'r+', encoding='UTF-8') as f:
print(json.load(f))
origin_dict = {'code': '200', 'data': [{'create_time': '剛剛', 'id': 1, 'title': '字典轉Json', 'url': '測試'}],
'msg': '請求成功'}
# 字典轉Json列印出來
print(json.dumps(origin_dict, ensure_ascii=False))
# 字典轉Json寫入檔案
with open('result.json', 'w+', encoding='UTF-8') as f:
json.dump(origin_dict, f, ensure_ascii=False, indent=8)
複製程式碼
執行結果如下:
# 控制檯輸出:
{'code': '200', 'data': [{'create_time': '2小時前', 'id': 3, 'title': '對話董明珠:這個時代要倡導利他思想', 'url': 'https://www.thepaper.cn/newsDetail_forward_3131849'}], 'msg': '請求成功'}
{'code': '200', 'data': [{'create_time': '23分鐘前', 'id': 4, 'title': '臉書與逾150家公司分享使用者資料,美國檢方正展開刑事調查', 'url': 'https://www.thepaper.cn/newsDetail_forward_3132840'}], 'msg': '請求成功'}
{"code": "200", "data": [{"create_time": "剛剛", "id": 1, "title": "字典轉Json", "url": "測試"}], "msg": "請求成功"}
# 輸出的json檔案內容:
{
"code": "200",
"data": [
{
"create_time": "23分鐘前",
"id": 4,
"title": "臉書與逾150家公司分享使用者資料,美國檢方正展開刑事調查",
"url": "https://www.thepaper.cn/newsDetail_forward_3132840"
}
],
"msg": "請求成功"
}
複製程式碼
Python物件與Json物件之間的關係如下表所示:
Python | Json |
---|---|
dict | object |
list, tuple | array |
str | string |
int, float | number |
True | true |
False | false |
None | null |
2、pickle模組
pickle模組
是Python提供的用於「物件序列化和反序列化」的模組,存取結構化資料。比如把一個字典儲存到檔案中,以及讀取出來,使用普通的file寫入的是字串,讀取的也是字串。而使用 pickle 的話,寫入的是字典,讀取出來的,也是字典。跟json模組一樣,只有四個函式:
- dumps():將資料通過特殊的形式轉換為只有Python語言認識的字串。
- dump():同dumps,並寫入檔案。
- loads():將pickle資料轉換為Python的資料結構。
- load():從資料檔案讀取,並轉換為Python的資料結構。
使用pickle模組的一些注意事項:
- pickle除了支援Python中所有的資料型別外,還支援函式,類,以及類的例項。
- load()函式,必須以二進位制可讀的模式開啟,即"rb";dump()函式,則需要以二進位制可寫的模式開啟,即"wb"。
使用pickle模組可能出現的異常:
- PickleError:封裝和拆封時出現的異常類,繼承自Exception。
- PicklingError: 遇到不可封裝的物件時出現的異常,繼承自PickleError。
- UnPicklingError: 拆封物件過程中出現的異常,繼承自PickleError。
示例程式碼如下:
import pickle
if __name__ == '__main__':
test_dict = {'code': '200', 'data': [{'create_time': '2小時前', 'id': 3, 'title': '對話董明珠:這個時代要倡導利他思想',
'url': 'https://www.thepaper.cn/newsDetail_forward_3131849'}], 'msg': '請求成功'}
# 序列化
p_str = pickle.dumps(test_dict)
print("序列化字典:", p_str)
# 反序列化
print("反序列化字典:", pickle.loads(p_str))
# 序列化到檔案中
with open("test.pkl", 'wb') as f:
pickle.dump(test_dict, f)
# 從檔案中序列化
with open("test.pkl", 'rb') as f:
print("從檔案中序列化:", pickle.load(f))
複製程式碼
執行結果如下:
序列化字典: b'\x80\x03}q\x00(X\x04\x00\x00\x00codeq\x01X\x03\x00\x00\x00200q\x02X\x04\x00\x00\x00dataq\x03]q\x04}q\x05(X\x0b\x00\x00\x00create_timeq\x06X\n\x00\x00\x002\xe5\xb0\x8f\xe6\x97\xb6\xe5\x89\x8dq\x07X\x02\x00\x00\x00idq\x08K\x03X\x05\x00\x00\x00titleq\tX3\x00\x00\x00\xe5\xaf\xb9\xe8\xaf\x9d\xe8\x91\xa3\xe6\x98\x8e\xe7\x8f\xa0\xef\xbc\x9a\xe8\xbf\x99\xe4\xb8\xaa\xe6\x97\xb6\xe4\xbb\xa3\xe8\xa6\x81\xe5\x80\xa1\xe5\xaf\xbc\xe5\x88\xa9\xe4\xbb\x96\xe6\x80\x9d\xe6\x83\xb3q\nX\x03\x00\x00\x00urlq\x0bX2\x00\x00\x00https://www.thepaper.cn/newsDetail_forward_3131849q\x0cuaX\x03\x00\x00\x00msgq\rX\x0c\x00\x00\x00\xe8\xaf\xb7\xe6\xb1\x82\xe6\x88\x90\xe5\x8a\x9fq\x0eu.'
反序列化字典: {'code': '200', 'data': [{'create_time': '2小時前', 'id': 3, 'title': '對話董明珠:這個時代要倡導利他思想', 'url': 'https://www.thepaper.cn/newsDetail_forward_3131849'}], 'msg': '請求成功'}
從檔案中序列化: {'code': '200', 'data': [{'create_time': '2小時前', 'id': 3, 'title': '對話董明珠:這個時代要倡導利他思想', 'url': 'https://www.thepaper.cn/newsDetail_forward_3131849'}], 'msg': '請求成功'}
複製程式碼
開啟序列化後的檔案:test.pkl,內容如下:
3、hashlib模組
Python中內建了一個字元加密模組:
hashlib
,整合了md5和sha模組,支援下面這些加密演算法:
__always_supported = ('md5', 'sha1', 'sha224', 'sha256', 'sha384', 'sha512',
'blake2b', 'blake2s',
'sha3_224', 'sha3_256', 'sha3_384', 'sha3_512',
'shake_128', 'shake_256')
複製程式碼
可以通過下述屬性檢視hash物件的相關資訊:
- name:檢視當前hash物件的加密演算法
- digest_size:hash密文佔多少個位元組
- block_size:hash資料庫的大小
使用程式碼示例:
import hashlib
origin_str = 'Hello Python!'
# md5加密
h_md5 = hashlib.md5()
h_md5.update(origin_str.encode('utf8'))
digest_str = h_md5.hexdigest()
print("md5加密: %s" % digest_str)
# 新增自定義key加密
h_md5_key = hashlib.md5('CoderPig'.encode('utf8'))
h_md5.update(origin_str.encode('utf8'))
digest_str = h_md5.hexdigest()
print("帶key md5加密後: %s" % digest_str)
# sha1加密
h_sha1 = hashlib.sha1()
h_sha1.update(origin_str.encode('utf8'))
digest_str = h_sha1.hexdigest()
print("sha1加密後: %s" % digest_str)
複製程式碼
執行結果如下:
md5加密: c0a5ef1508044415ffd76c57ebd51b19
帶key md5加密後: 27fd294cd16301d09a5e94840763c43b
sha1加密後: 2aac9ef117b5f1fd0be0380bf1e4e10dc62bfbf7
複製程式碼
注意:SHA-1與MD5都是摘要演算法,且為不可逆演算法!!!另外,如果需要加密的字串過長的話,可以使用同一個hash物件分多次加密,即多次update()。
4、base64模組
Python中提供的把二進位制位元組流編碼為64個字元
的模組,有一點要注意:
輸入的base64編碼字串必須符合base64的padding規則:當原資料長度不是3的整數倍時:剩下2個輸入資料,編碼結果後加一個'=';剩下1個輸入資料,編碼結果加2個'='。以確保資料還原的正確性,否則會報:binascii.Error: Incorrect padding 的錯誤!!!
編解碼的程式碼示例如下:
import base64
test_str = "一段等待Base64編碼的字串"
if __name__ == '__main__':
# 編碼(轉換為二進位制才可以進行編碼)
encode_str = base64.b64encode(test_str.encode('utf-8'))
print("編碼後:", encode_str)
# 解碼(解碼後為二進位制,同樣要轉換下)
decode_str = base64.b64decode(encode_str)
print("解碼後:", decode_str.decode('utf-8'))
複製程式碼
執行結果如下:
編碼後: b'5LiA5q61562J5b6FQmFzZTY057yW56CB55qE5a2X56ym5Liy'
解碼後: 一段等待Base64編碼的字串
複製程式碼
如果本文對你有所幫助,歡迎
留言,點贊,轉發
素質三連,謝謝?~