阅读 573

猪行天下之Python基础——10.2 Python常用模块(下)

内容简述:

  • 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编码的字符串
复制代码

如果本文对你有所帮助,欢迎
留言,点赞,转发
素质三连,谢谢😘~