豬行天下之Python基礎——10.2 Python經常使用模塊(下)

內容簡述:

  • 一、json模塊
  • 二、pickle模塊
  • 三、hashlib模塊
  • 四、base64模塊

一、json模塊

Json是一種輕量級的數據交換格式,在平常開發中常常須要從Json字符串中提取數據,或者把數據轉換爲Json字符串,Python中內置了一個json模塊來處理Json數據。json模塊提供了下述四個函數來完成相互轉換:python

  • json.load():Json轉字典,接受包含json數據的文件對象
  • json.loads():Json轉字典,接受json字符串,而非文件對象
  • json.dump():字典轉Json,第一個參數爲對象字典,第二個參數爲文件對象,直接寫入文件。
  • json.dumps():字典轉Json,第一個參數爲對象字典。

dump和dumps還有下述這些經常使用的可選參數:nginx

  • 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對象之間的關係以下表所示json

Python Json
dict object
list, tuple array
str string
int, float number
True true
False false
None null

二、pickle模塊

pickle模塊 是Python提供的用於「對象序列化和反序列化」的模塊,存取結構化數據。好比把一個字典保存到文件中,以及讀取出來,使用普通的file寫入的是字符串,讀取的也是字符串。而使用 pickle 的話,寫入的是字典,讀取出來的,也是字典。跟json模塊同樣,只有四個函數:bash

  • dumps():將數據經過特殊的形式轉換爲只有Python語言認識的字符串。
  • dump():同dumps,並寫入文件。
  • loads():將pickle數據轉換爲Python的數據結構。
  • load():從數據文件讀取,並轉換爲Python的數據結構。

使用pickle模塊的一些注意事項數據結構

  • pickle除了支持Python中全部的數據類型外,還支持函數,類,以及類的實例
  • load()函數,必須以二進制可讀的模式打開,即"rb"dump()函數,則須要以二進制可寫的模式打開,即"wb"

使用pickle模塊可能出現的異常app

  • 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,內容以下:


三、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()。


四、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編碼的字符串
複製代碼

若是本文對你有所幫助,歡迎
留言,點贊,轉發
素質三連,謝謝😘~

相關文章
相關標籤/搜索