- 定义:写好的代码集合,直接调用它的功能(py文件,c语言编译之后的文件,内置函数很多pass都是通过c编译的)
- 作用:内存空间是有限的,存放在硬盘里,当需要的时候加载到内存,把丰富的功能封装在一个文件中,等用的时候,直接导入内存就可以使用
- 分类:
- 内置模块:python内置的一些常用模块,如json、pickle、hashlib、loggin、time、sys、os等
- 扩展模块:第三方模块如itchat微信,beautifulsoup爬虫,django
- 自定义模块:自己写的py文件(分模块:功能独立防止代码过长)
- 序列化模块:json、pickle、shelve用于方便数据网络传输,文件的读写操作 (文件中可以存储:字符串,和bytes.数据的传输:bytes类型.)
- 序列化:将原本是字典、列表等内容转换成 双引号 表示的 序列化字符串的过程
- 反序列化:将序列化的字符串转换成原数据类型
- json:
- 适用于不同编程语言之间的,支持除set之外所有的python数据类型(int,str,bool,None,list,tule,dict)转成str;
- 优点:可以在各个语言中交互、可以直接通过网络传输,不用再转成bytes类型
- 缺点:不能将多个序列化字符串,通过load回来,需要通过dumps将目标数据转成str,然后通过文件操作写入f.write(data),最后通过loads回来
- import json
- dumps loads 用于网络的传输,如微信接口的交互
- 注:
- 1、元组序列化后变成列表,反转回来不会变成元组,而是列表!!!
- 2、中文型,会转成u....bytes,如想看懂内容,加参数json.dumps(dic,ensure_ascii=False)
- 3、json如果转dict,dict的key不能是元组,int型的key,反转回来变成字符串 '1'、dumps必须是字符串
- 4、会序列化成双引号的字符串
- 原数据类型转序列化字符串:ret = json.dumps(dic)
- 序列化字符串转换成原数据类型:ret2 = json.loads(ret)
- dump load 用于操作文件,对文件句柄的操作
- json.dump(obj,fb) fb为文件句柄
- json.load(fb)
- # 用 dump load 只能写入和读取文件 一个序列化的字符串,会报错,解决方法如下:
- pickle:
- 只用于python语言之间的,支持python所有基础数据类型转换;
- pickle序列化成bytes类型,json是除中文可以看懂的
- 一样两对,4种方法
- dic_seqStr = pickle.dumps(obj)
- seqStr_dic = pickle.loads(str)
- pickle.dump(obj,fb)
- pickle.load(fb)
- dump、load可写入多个序列化字符串,可反转load多个序列化,和json不同
- shelve:
- 仅python语言使用,对文件的操作
- 写:
- f = shelve.open(file) # 直接对文件句柄操作,可以写入文件,file不能为数字命名
- existsing = f['key']
- f['key'] = {"name":111, "age": 30} 以字典的形式将目标数据序列化写入文件{“key”:{"name":111, "age": 30}}
- f.close()
- 读:
- f = shelve.open(file)
- print(f['key']) # key没有报错
- f.close()
- 可改:
- f['key']=new_date
- 新增,以字典的形式新增,那么原数据必须是以字典形式写入的
- f = shelve.open(file,writeback=True) 只有true时才能新增,不然无法新增
- f['key']['new_key'] = 'values'
- 文件加密模块:hashlib
- 主要两种摘要算法:md5、sha系列
- 特点:单向计算,无法反推明文
- 作用:密文验证,文件校验
- sha系列用法同md5一样,只是加密更安全,代价是效率低些
- 密文加密:
- 算法1:md5
- 特点:生成定长32位的16进制数字
- pwd = '我的密码'
- import hashlib # 导入模块
- obj = hashlib.md5() # 创建对象 ,括号里可加参数,在密文得基础上再加一些指定得东西,如下
- # obj = hashlib.md5(指定增加的东西可为固定的也可为变量.encode('utf-8'))
- obj.update(pwd.encode('utf-8')) # 调用对象方法update,对密文加密,必须时bytes类型
- obj.hexdigest() # 得到加密结果,定长32位
- 算法1:md5
- 文件校验
- 算法1:md5
- 特点:可以分段/块来读,不大量占用内存
- # 1、小文件
- def md5_small_file(file_name):
- with open(file_name, 'rb') as f: # 以字节的形式读,就不需要转了
- file = f.read()
- obj1 = hashlib.md5(file_name[::2].encode('utf-8'))
- obj1.update(file) # file 本身就是bytes了
- return obj1.hexdigest()
- # 2、大文件 (如果文件大,就不能一次性都出来,md5支持,一段一段比,最后得出加密的密文)def md5_big_file(file_name):
- def md5_big_file(file_name):
- with open(file_name, 'rb') as f:
- obj = hashlib.md5(file_name[::2].encode('utf-8')) # 先创建对象
- while True:
- file_site = f.read(1024) # 循环每次1024个字节
- if file_site:
- obj.update(file_site)
- else:
- return obj.hexdigest()
- 算法1:md5
- 主要两种摘要算法:md5、sha系列
- 日志记录模块:logging
- 作用:在逻辑容易出错位置手动添加日志功能,记录报错信息到文件,以便于排错
- 特点1:非自动记录,为人工指定位置,指定报错信息内容
- 特点2:默认将日志打印到标准输出中,级别为>=warning,可以调整
- 特点3:默认记录和输出格式为 日志级别warning:日志器名root:信息内容
- 特点4:默认写入文件是追加模式,可以调整
- 缺点:默认情况下不能同时将日志信息输出和写入文件,只能二选一,可以调整
- 提供五种模式:
- 1、logging.debug('message') # 自定义的排错信息
- 2、logging.info('message') # 自定义的正常信息
- 3、logging.warning('message') # 自定义的警告信息,程序可以运行,但要进行修改,不符合规范
- 4、logging.error('message') # 自定义的错误信息
- 5、logging.critical('message') # 自定义的严重错误信息
- 注:logging.log(level,msg) # 自定义等级的日志信息
- low版:无法同时文件及控制台都显示
- 可以调整记录日志级别、记录格式、是否覆盖写还是追加写
- logging.basicConfig( level=logging.DEBUG, # 指定默认日志器的日志级别
- filename='log.log' , # 指定写入的文件名(一旦指定了文件,没有其他设置就无法标准输出了)
- filemode = 'w' , # 指定文件打开方式,默认a
- format = '%(asctime)s %(filename)s [line:%(lineno)d] %(levelname)s %(message)s' # 指定日志显示得格式
- datefmt= '%a %d %b %Y %H:%M:%S', # 指定日期的时间格式,需与format的‘%(asctime)s’一起才有效
- stream = sys.stdout) # 指定输出到屏幕的方式,sys.stdout,sys.stderr,网络stream,不能同filename一起
- high版:通过logger对象操作,无极限定制
- 1、创建对象
- obj = logging.getLoger(__name__)
- 2、指定全局日志级别
- logging.setLevel(logging.INFO)
- 3、创建handler
- fh = logging.FileHandler()或sh =loggin.StreamHandler()
- 4、指定handler的日志级别(必须高于logger级别)
- fh.setLevel()
- 5、创建handler的日志格式 (可创建多个不同的格式)
- custom_format = logging.Formatter()
- 6、指定handler的日志格式
- handlerX.setFormatter(custom_format)
- 7、日志器logger调用handler处理器
- obj.addHandler(handler)
- 8、配置各个日志级别的日志记录message
- longging.debug(msg)
- 1、创建对象