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

栏目: 编程工具 · 发布时间: 6年前

内容简介:打开序列化后的文件:test.pkl,内容如下: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,内容如下:

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

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

如果本文对你有所帮助,欢迎

留言,点赞,转发 素质三连,谢谢:kissing_heart:~

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

以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

Practical Algorithms for Programmers

Practical Algorithms for Programmers

Andrew Binstock、John Rex / Addison-Wesley Professional / 1995-06-29 / USD 39.99

Most algorithm books today are either academic textbooks or rehashes of the same tired set of algorithms. Practical Algorithms for Programmers is the first book to give complete code implementations o......一起来看看 《Practical Algorithms for Programmers》 这本书的介绍吧!

RGB转16进制工具
RGB转16进制工具

RGB HEX 互转工具

Markdown 在线编辑器
Markdown 在线编辑器

Markdown 在线编辑器

正则表达式在线测试
正则表达式在线测试

正则表达式在线测试