• 定义:写好的代码集合,直接调用它的功能(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、小文件
  • 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()
  • 日志记录模块: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、指定全局日志级别
  • 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)