第九章 常用模块(续)

1.序列化模块

1.1 什么叫序列化

例:有一个班级信息字典{‘10010000‘:{‘name‘:‘zhangsan‘, ‘age‘:22, ‘class‘:‘python21‘},...},在程序结束后需要保存,而在python中只有字符串能保存到文件中。再次使用字典的时候,可以使用eval转化,但是非常不安全,所以引入了序列化

序列化就是 数据类型转化成字符串的过程 -- 数据类型 --> 字符串的过程

字符串化也叫做序列化

1.2 为什么要用序列化呢?(固态存储、网络传输)

数据从内存到文件

数据在网络上传输,在网线上能够传递的只有 010101 -- 字节 -- 字符串 -- 字典

1.3 python中的序列化模块都有哪些?

  json 通用的 支持的数据类型 list tuple dict

  pickle 在python中通用的 支持几乎所有python中的数据类型

  shelve 在py3种不是很好用,在python中使用的便捷的序列化工具

2.json模块

基于内存的操作

import json
dic = {‘k‘: ‘v‘}
# 基于内存的操作(和内存交互的)
print(type(dic))
# <class ‘dict‘>
json_dic = json.dumps(dic) # 所有引号都会变成双引号字典 转化成字符串的过程 -- 序列化
print(json_dic)
# {"k": "v"}
print(dic)
# {‘k‘: ‘v‘}
print(type(json_dic))
# <class ‘str‘>
print(json.loads(json_dic)) # 字符串 转回其他数据类型的过程 -- 反序列化
# {‘k‘: ‘v‘}

基于文件的操作

# 基于文件的操作
import json
dic = {‘k‘: ‘v‘}
# 写入文件
with open(‘d‘, ‘w‘) as f:
    json.dump(dic, f)  #dump是和文件交互的

# 查看文件
with open(‘d‘) as f:
    print(json.load(f)) # 从文件中反序列化
# {‘k‘: ‘v‘}

# 如果要dump多条数据
# 每一条数据dumps一下 编辑成字符串,然后打开文件 write写进文件里 \n
# 读取的时候按照标志读取或者按行读
# 读出来之后 在使用loads

with open(‘aaa‘, ‘w‘) as f:
    str_dic = json.dumps(dic)
    f.write(str_dic + ‘\n‘)
    f.write(str_dic + ‘\n‘)
    f.write(str_dic + ‘\n‘)
    f.write(str_dic + ‘\n‘)
# cat aaa
# {"k": "v"}
# {"k": "v"}
# {"k": "v"}
# {"k": "v"}

with open(‘aaa‘) as f:
    for line in f:
        print(json.loads(line.strip()))
# {‘k‘: ‘v‘}
# {‘k‘: ‘v‘}
# {‘k‘: ‘v‘}
# {‘k‘: ‘v‘}

3.pickle模块

pickle模块的基本用法很json模块相同

import pickle
# pickle看不到转码后的内容
class A:
    def __init__(self, name):
        self.name = name

alex = A(‘alex‘)
# json.dumps(alex) # 支持的数据类型有限
# TypeError: Object of type ‘A‘ is not JSON serializable
print(pickle.dumps(alex))
# b‘\x80\x03c__main__\nA\nq\x00)\x81q\x01}q\x02X\x04\x00\x00\x00nameq\x03X\x04\x00\x00\x00alexq\x04sb.‘

基于文件的操作

pickle模块相对json模块的优势一:支持几乎所有python中的数据类型

with open(‘bbb‘, ‘wb‘) as f:
    pickle.dump(alex, f)

with open(‘bbb‘, ‘rb‘) as f:
    print(pickle.load(f))
# <__main__.A object at 0x00000159473C5940>

with open(‘bbb‘, ‘rb‘) as f:
    obj = pickle.load(f)
    print(obj.name)
# alex

pickle模块相对json模块的优势二:多次load内容比较简单

# 多次写入文件
with open(‘bbb‘, ‘wb‘) as f:
    pickle.dump(alex, f)
    pickle.dump(alex, f)
    pickle.dump(alex, f)
    pickle.dump(alex, f)

# 多次读取内容
with open(‘bbb‘, ‘rb‘) as f:
    try:
        while True:
            obj = pickle.load(f)
            print(obj.name)
    except EOFError:pass
# alex
# alex
# alex
# alex

总结:

1.pickle支持更多的数据类型
2.pickle的结果是二进制
3.pickle在和文件交互的时候可以被多次load

4.hashlib摘要算法模块

Python的hashlib提供了常见的摘要算法,如MD5,SHA1等等。

什么是摘要算法呢?摘要算法又称哈希算法、散列算法。它通过一个函数,把任意长度的数据转换为一个长度固定的数据串(通常用16进制的字符串表示)。

摘要算法就是通过摘要函数f()对任意长度的数据data计算出固定长度的摘要digest,目的是为了发现原始数据是否被人篡改过。

摘要算法之所以能指出数据是否被篡改过,就是因为摘要函数是一个单向函数,计算f(data)很容易,但通过digest反推data却非常困难。而且,对原始数据做一个bit的修改,都会导致计算出的摘要完全不同。

最常使用的两种算法sha/md5

4.1 使用hashlib模块获取字符串的MD5值

import hashlib# 例:使用hashlib模块获取字符串的md5值
md5obj = hashlib.md5() # 实例化一个MD5摘要算法的对象
md5obj.update(‘alex3714‘.encode(‘utf-8‘)) # 使用md5算法的对象来操作字符串(bytes类型)
ret = md5obj.hexdigest() ## 获取算法的结果 hex + digest 16进制+消化
print(ret, type(ret), len(ret))
# aee949757a2e698417463d47acac93df <class ‘str‘> 32

4.2 使用hashlib模块获取字符串的sha值

# sha算法,后面的数字越大,结果越长
md5obj = hashlib.sha256() # 实例化一个sha摘要算法的对象
md5obj.update(‘alex3714‘.encode(‘utf-8‘)) # 使用sha算法的对象来操作字符串(bytes类型)
ret = md5obj.hexdigest() ## 获取算法的结果 hex + digest 16进制+消化
print(ret, type(ret), len(ret))
#sha1 8a003668a9c990f15148f9e4046e1410781533b6 <class ‘str‘> 40
#sha256 1e1c67170a2136ba7e18ffee2461fdbcdcf0884d9d9d005d4ab8c8733a15f8ab <class ‘str‘> 64

4.3 高级用法 -- 加盐

# 例:使用md5算法进行加密认证
md5obj = hashlib.md5(‘tesla‘.encode(‘utf-8‘)) # 加盐过程
md5obj.update(‘alex3714‘.encode(‘utf-8‘)) # 使用md5算法的对象来操作字符串(bytes类型)
ret = md5obj.hexdigest() ## 获取算法的结果 hex + digest 16进制+消化
print(ret, type(ret), len(ret))
# aee949757a2e698417463d47acac93df <class ‘str‘> 32 # 加盐前
# 7dafaec086d0ddae18b63e4fffafbf8e <class ‘str‘> 32 # 加盐后

动态加盐

# 动态加盐 -- 有些网站,一旦注册了,用户名就不能更改了,原因是用户名当盐
username = ‘alex‘
md5obj = hashlib.md5(username.encode(‘utf-8‘)) # 加盐过程
md5obj.update(‘alex3714‘.encode(‘utf-8‘)) # 使用md5算法的对象来操作字符串(bits类型)
ret = md5obj.hexdigest() ## 获取算法的结果 hex + digest 16进制+消化
print(ret, type(ret), len(ret))
# ee838c58e5bb3c9e687065edd0ec454f <class ‘str‘> 32

4.4 校验文件的一致性

# 校验文件的一致性
# 自动化 -- python代码来做验证
md5obj = hashlib.md5() # 实例化一个MD5摘要算法的对象
md5obj.update(‘alex3714‘.encode(‘utf-8‘)) #使用md5算法的对象来操作字符串(bytes类型)
print(md5obj.hexdigest())
# aee949757a2e698417463d47acac93df
md5obj = hashlib.md5()
md5obj.update(‘alex‘.encode(‘utf-8‘))
md5obj.update(‘3714‘.encode(‘utf-8‘)) #使用md5算法的对象来操作字符串(bytes类型)
print(md5obj.hexdigest())
# aee949757a2e698417463d47acac93df
# 说明:分多次对同一个字符串进行摘要和一次性对这个字符串的摘要的结果是相同的

5.configparser模块 -- ini配置文件

该模块适用于配置文件的格式与windows ini文件类似,可以包含一个或多个节(section),每个节可以有多个参数(键=值)。

5.1 配置文件格式

[DEFAULT]
ServerAliveInterval = 45
Compression = yes
CompressionLevel = 9
ForwardX11 = yes

[bitbucket.org]
User = hg

[topsecret.server.com]
Port = 50022
ForwardX11 = no 

5.2 写入文件范例

import configparser

# 实例化config对象
config = configparser.ConfigParser()

# 给config添加内容
# []内为配置文件内的组名
# 后面的字典为组内配置的键值对
config["DEFAULT"] = {‘ServerAliveInterval‘: ‘45‘,
                      ‘Compression‘: ‘yes‘,
                     ‘CompressionLevel‘: ‘9‘,
                     ‘ForwardX11‘:‘yes‘
                     }

config[‘bitbucket.org‘] = {‘User‘:‘hg‘}

config[‘topsecret.server.com‘] = {‘Host Port‘:‘50022‘,‘ForwardX11‘:‘no‘}

with open(‘example.ini‘, ‘w‘) as configfile:
    # 使用config的方法将相应配置,写入文件
    config.write(configfile)

5.3 查找文件

import configparser

config = configparser.ConfigParser()

#---------------------------查找文件内容,基于字典的形式

print(config.sections())        #  []

config.read(‘example.ini‘)

print(config.sections())        #   [‘bitbucket.org‘, ‘topsecret.server.com‘]

print(‘bytebong.com‘ in config) # False
print(‘bitbucket.org‘ in config) # True

print(config[‘bitbucket.org‘]["user"])  # hg

print(config[‘DEFAULT‘][‘Compression‘]) #yes

print(config[‘topsecret.server.com‘][‘ForwardX11‘])  #no

print(config[‘bitbucket.org‘])          #<Section: bitbucket.org>

for key in config[‘bitbucket.org‘]:     # 注意,有default会默认default的键
    print(key)

print(config.options(‘bitbucket.org‘))  # 同for循环,找到‘bitbucket.org‘下所有键

print(config.items(‘bitbucket.org‘))    #找到‘bitbucket.org‘下所有键值对

print(config.get(‘bitbucket.org‘,‘compression‘)) # yes       get方法Section下的key对应的value

5.4 增删改操作

import configparser

config = configparser.ConfigParser()

config.read(‘example.ini‘)

config.add_section(‘yuan‘)

config.remove_section(‘bitbucket.org‘)
config.remove_option(‘topsecret.server.com‘,"forwardx11")

config.set(‘topsecret.server.com‘,‘k1‘,‘11111‘)
config.set(‘yuan‘,‘k2‘,‘22222‘)

config.write(open(‘new2.ini‘, "w"))

7.logging模块

7.1 默认情况下Python的logging模块将日志打印到了标准输出中,且只显示了大于等于WARNING级别的日志,这说明默认的日志级别设置为WARNING(日志级别等级CRITICAL > ERROR > WARNING > INFO > DEBUG),默认的日志格式为日志级别:Logger名称:用户输出消息。

日志级别

logging.debug(‘debug message‘)     # 非常细节的日志 -- 排查错误的时候使用
# DEBUG:root:debug message
logging.info(‘info message‘)      # 正常的日志信息
# INFO:root:info message
logging.warning(‘warning message‘)   # 警告,出现错误,但是程序可以正常运行
# WARNING:root:warning message
logging.error(‘error message‘)     # 错误
# ERROR:root:error message
logging.critical(‘critical message‘)  # 严重错误,程序只能重启才能正常运行
# CRITICAL:root:critical message

7.2 格式化输出

灵活配置日志级别,日志格式,输出位置

logging.basicConfig()函数中可通过具体参数来更改logging模块默认行为,可用参数有:

filename:用指定的文件名创建FiledHandler,这样日志会被存储在指定的文件中。
filemode:文件打开方式,在指定了filename时使用这个参数,默认值为“a”还可指定为“w”。
format:指定handler使用的日志显示格式。
datefmt:指定日期时间格式。
level:设置rootlogger(后边会讲解具体概念)的日志级别
stream:用指定的stream创建StreamHandler。可以指定输出到sys.stderr,sys.stdout或者文件(f=open(‘test.log’,’w’)),默认为sys.stderr。若同时列出了filename和stream两个参数,则stream参数会被忽略。

format参数中可能用到的格式化串:
%(name)s Logger的名字
%(levelno)s 数字形式的日志级别
%(levelname)s 文本形式的日志级别
%(pathname)s 调用日志输出函数的模块的完整路径名,可能没有
%(filename)s 调用日志输出函数的模块的文件名
%(module)s 调用日志输出函数的模块名
%(funcName)s 调用日志输出函数的函数名
%(lineno)d 调用日志输出函数的语句所在的代码行
%(created)f 当前时间,用UNIX标准的表示时间的浮 点数表示
%(relativeCreated)d 输出日志信息时的,自Logger创建以 来的毫秒数
%(asctime)s 字符串形式的当前时间。默认格式是 “2003-07-08 16:49:45,896”。逗号后面的是毫秒
%(thread)d 线程ID。可能没有
%(threadName)s 线程名。可能没有
%(process)d 进程ID。可能没有
%(message)s用户输出的消息

format添加格式

# 灵活配置日志级别,日志格式,输出位置:
# format添加格式
logging.basicConfig(level=logging.DEBUG,
                    format=(‘%(asctime)s %(filename)s[line:%(lineno)d] %(levelname)s %(message)s‘)) # 默认包含warning及以上的信息
logging.debug(‘debug message‘)     # 非常细节的日志 -- 排查错误的时候使用
logging.info(‘info message‘)      # 正常的日志信息
logging.warning(‘warning message‘)   # 警告,出现错误,但是程序可以正常运行
logging.error(‘error message‘)     # 错误
logging.critical(‘critical message‘)  # 严重错误,程序只能重启才能正常运行
# 2018-05-24 22:36:02,509 07 logging模块.py[line:27] DEBUG debug message
# 2018-05-24 22:36:02,509 07 logging模块.py[line:28] INFO info message
# 2018-05-24 22:36:02,510 07 logging模块.py[line:29] WARNING warning message
# 2018-05-24 22:36:02,510 07 logging模块.py[line:30] ERROR error message
# 2018-05-24 22:36:02,510 07 logging模块.py[line:31] CRITICAL critical message

datefmt更改日期格式

# datefmt更改日期格式
logging.basicConfig(level=logging.DEBUG,
                    format=(‘%(asctime)s %(filename)s[line:%(lineno)d] %(levelname)s %(message)s‘),
                    datefmt = ‘%a, %d %b %Y %H:%M:%S‘)
logging.debug(‘debug message‘)     # 非常细节的日志 -- 排查错误的时候使用
logging.info(‘info message‘)      # 正常的日志信息
logging.warning(‘warning message‘)   # 警告,出现错误,但是程序可以正常运行
logging.error(‘error message‘)     # 错误
logging.critical(‘critical message‘)  # 严重错误,程序只能重启才能正常运行
# Sun, 20 May 2018 16:18:20 07 logging模块.py[line:11] DEBUG debug message
# Sun, 20 May 2018 16:18:20 07 logging模块.py[line:13] INFO info message
# Sun, 20 May 2018 16:18:20 07 logging模块.py[line:15] WARNING warning message
# Sun, 20 May 2018 16:18:20 07 logging模块.py[line:17] ERROR error message
# Sun, 20 May 2018 16:18:20 07 logging模块.py[line:19] CRITICAL critical message

filename添加日志文件,filemode添加写入文件格式a-追加,w-写入

# filename添加日志文件,filemode文件打开方式a追加,w写入
logging.basicConfig(level=logging.DEBUG,
                    format=(‘%(asctime)s %(filename)s[line:%(lineno)d] %(levelname)s %(message)s‘),
                    datefmt = ‘%a, %d %b %Y %H:%M:%S‘,
                    filename=‘test.log‘,
                    filemode=‘w‘)
logging.debug(‘debug message‘)     # 非常细节的日志 -- 排查错误的时候使用
logging.info(‘info message‘)      # 正常的日志信息
logging.warning(‘warning message‘)   # 警告,出现错误,但是程序可以正常运行
logging.error(‘error message‘)     # 错误
logging.critical(‘critical message‘)  # 严重错误,程序只能重启才能正常运行
# test.log文件内容
# Sun, 20 May 2018 16:18:20 07 logging模块.py[line:11] DEBUG debug message
# Sun, 20 May 2018 16:18:20 07 logging模块.py[line:13] INFO info message
# Sun, 20 May 2018 16:18:20 07 logging模块.py[line:15] WARNING warning message
# Sun, 20 May 2018 16:18:20 07 logging模块.py[line:17] ERROR error message
# Sun, 20 May 2018 16:18:20 07 logging模块.py[line:19] CRITICAL critical message

7.3 logger对象的配置

import logging
# logger对象的方式配置
logger = logging.getLogger()
# 吸星大法

# 先创造一个格式
formatter = logging.Formatter(‘%(asctime)s - %(name)s - %(levelname)s - %(message)s‘)
formatter1 = logging.Formatter(‘%(asctime)s - %(levelname)s - %(message)s‘)
# 往文件中输入 handler处理文件
fh = logging.FileHandler(filename=‘log.log‘) # 创造了一个能操作文件的对象fh
fh.setFormatter(formatter) # 高可定制化
logger.addHandler(fh)

# 往屏幕输出
sh = logging.StreamHandler()
sh.setFormatter(formatter1) # 高可定制化
logger.addHandler(sh)

fh.setLevel(logging.ERROR) # 定义输出的最低日志级别
sh.setLevel(logging.DEBUG)

logging.debug(‘debug message‘)     # 非常细节的日志 -- 排查错误的时候使用
logging.info(‘info message‘)      # 正常的日志信息
logging.warning(‘warning message‘)   # 警告,出现错误,但是程序可以正常运行
logging.error(‘error message‘)     # 错误
logging.critical(‘critical message‘)  # 严重错误,程序只能重启才能正常运行

# fh
# 2018-05-24 22:51:42,426 - root - ERROR - error message
# 2018-05-24 22:51:42,426 - root - CRITICAL - critical message
# sh
# 2018-05-24 22:50:39,370 - WARNING - warning message
# 2018-05-24 22:50:39,370 - ERROR - error message
# 2018-05-24 22:50:39,370 - CRITICAL - critical message

# 说明:logging库提供了多个组件:Logger、Handler、Filter、Formatter。Logger对象提供应用程序可直接使用的接口,Handler发送日志到适当的目的地,Filter提供了过滤日志信息的方法,Formatter指定日志显示格式。另外,可以通过:logger.setLevel(logging.Debug)设置级别,当然,也可以通过
# fh.setLevel(logging.Debug)单对文件流设置某个级别。

原文地址:https://www.cnblogs.com/gnaix/p/9077570.html

时间: 2024-10-14 23:21:14

第九章 常用模块(续)的相关文章

第九章 常用模块

第九章 常用模块 1.模块介绍 什么是模块: 模块就是我们通常说的py文件(因此写python程序的时候不要命名为模块的名称),模块是写好了但不直接使用的功能 为什么这些模块中提供的方法 不能像print这些内置函数一样直接使用呢? 是因为如果所有的模块都是执行python程序直接导入了,会非常占用内存空间的 常见导入模块的方法 1.import time 2.from time import sleep 模块的分类: 内置模块 扩展模块 https://pypi.org 自定义模块 2.扩展数

第七章 常用模块&amp;面向对象程序设计

一.xml模块 <?xml version="1.0"?> -<data> -<country name="Liechtenstein" a="1"> <rank updated="yes">2</rank> <year updated="yes" version="1.0">2010</year> &l

Python 常用模块续

一.logging 用于记录日志并线程安全的模块 import logging logging.basicConfig(level=logging.DEBUG, format='%(asctime)s - %(name)s - %(levelname)s -%(module)s: %(message)s', datefmt='%Y-%m-%d %H:%M:%S %p', filename='log.txt', filemode='w' ) logging.debug("debug message

C语言基础 第九章 常用字符串操作函数

sscanf():可以将一个长的字符串按照需求分割成想要的格式 实例: #include<stdio.h> #include<string.h> int main() { //1. 取指定长度的字符串 char str[100]; sscanf("12345","%4s",str); printf("%s\n",str);//1234 //2. 格式化时间 int year, month, day, hour, minut

进击的Python【第五章】:Python的高级应用(二)常用模块

Python的高级应用(二)常用模块学习 本章学习要点: Python模块的定义 time &datetime模块 random模块 os模块 sys模块 shutil模块 ConfigParser模块 shelve模块 xml处理 re正则表达式 一.Python模块的定义 有过C语言编程经验的朋友都知道在C语言中如果要引用sqrt这个函数,必须用语句"#include<math.h>"引入math.h这个头文件,否则是无法正常进行调用的.那么在Python中,如

第六章:Python基础の反射与常用模块解密

本課主題 反射 Mapping 介绍和操作实战 模块介绍和操作实战 random 模块 time 和 datetime 模块 logging 模块 sys 模块 os 模块 hashlib 模块 re 模块 本周作业 反射 Mapping 介绍和操作实战 反射是利用字符串的形式去对象 (模块) 中操作 (寻找/检查) 成员 案例例子 假设创建了一个common.py 程序里而有3个功能,比如网站里的登录页面.主页页面还有登出页面都是不同的页面,要显示的内容都不一样. def login(): p

Python笔记第3章,模块和模块的常用方法,函数式编程yield,三元运算Lambda表达式,内置涵数,常用模块

<--目录--> 模块和模块的常用方法 函数式编程 yield 三元运算 Lambda表达式 内置涵数 常用模块 [模块和模块的常用方法]至关重要的__init__.py    #包一定要有这个__init__.py文件,他才是包,这样才能通过form 包名 import 模块名(.py文件名)来去引用这个包的某个模块的某个函数功能 判断是否为主文件:__name__ if __name__ == '__main__' 当前文件路径: __file__ 当前文件描述: __doc__ 1)if

python全栈开发【第九篇】Python常用模块一(主要是re正则和collections)

一.认识模块  什么是模块:一个模块就是一个包含了python定义和声明的文件,文件名就是加上.py的后缀,但其实import加载的模块分为四个通用类别 : 1.使用python编写的代码(.py文件) 2.已被编译为共享库二和DLL的C或C++扩展 3.包好一组模块的包 4.使用C编写并连接到python解释器的内置模块  为何要使用莫模块? 如果你想退出python解释器然后重新进入,那么你之前定义的函数或变量都将丢失,因此我们通常将程序写到文件中以便永久保存下来,需要时,就通过python

第九章: 输入与输出

@font-face{ font-family:"Times New Roman"; } @font-face{ font-family:"宋体"; } @font-face{ font-family:"Arial"; } @font-face{ font-family:"黑体"; } @font-face{ font-family:"微软雅黑"; } p.MsoNormal{ mso-style-name