15.02 模块
目录:
- 一 time与datetime模块
- 二 random模块
- 三 os模块
- 四 sys模块
- 五 shutil模块
- 六 json&pickle模块
- 七 shelve模块
- 八 xml模块
- 九 configparser模块
- 十 hashlib模块
- 十一 suprocess模块
- 十二 logging模块
补充:猴子补丁
一、time与datetime模块
import time # print(time.time()) # print(time.strftime("%Y-%m-%d %H:%M:%S")) # s = time.localtime() # s1 = time.gmtime()
gmtime([secs]) 和localtime()方法类似,gmtime()方法是将一个时间戳转换为UTC时区(0时区)的struct_time
# print(s) # print(s1) # print(s.tm_year) # print(s.tm_mday) # res1 = time.localtime(1231331) # res2 = time.strftime("%Y-%m-%d %H:%M:%S",res1) # print(res2) # res1 = time.strptime('2017-11-11 11:11:11',"%Y-%m-%d %H:%M:%S") # res2 = time.mktime(res1) # print(res2) import datetime # print(datetime.datetime.now()) print(datetime.datetime.now() - datetime.timedelta(days=3)) print(datetime.datetime.now() + datetime.timedelta(days=-3)) print(datetime.datetime.now() + datetime.timedelta(weeks=3))
import time # print(time.asctime()) #=====>Mon Aug 16 16:12:26 2021 # print(time.ctime()) # Mon Aug 16 16:14:26 2021 # print(time.ctime(time.time())) # Mon Aug 16 16:14:26 2021 # # 其他方法: # 1 # sleep(secs) # 2 # 线程推迟指定的时间运行,单位为秒。
二、random模块
1 import random 2 3 print(random.random())#(0,1)----float 大于0且小于1之间的小数 4 5 print(random.randint(1,3)) #[1,3] 大于等于1且小于等于3之间的整数 6 7 print(random.randrange(1,3)) #[1,3) 大于等于1且小于3之间的整数 8 9 print(random.choice([1,'23',[4,5]]))#1或者23或者[4,5] 10 11 print(random.sample([1,'23',[4,5]],2))#列表元素任意2个组合 12 13 print(random.uniform(1,3))#大于1小于3的小数,如1.927109612082716 14 15 16 item=[1,3,5,7,9] 17 random.shuffle(item) #打乱item的顺序,相当于"洗牌" 18 print(item)
生成随机验证码 import random def make_code(size): res = "" for i in range(size): num = str(random.randint(1, 9)) s= chr(random.randint(65, 90)) res += random.choice([num,s]) return res res = make_code(6) print(res)
三、OS模块与subprocess
os.getcwd() 获取当前工作目录,即当前python脚本工作的目录路径 os.chdir("dirname") 改变当前脚本工作目录;相当于shell下cd os.curdir 返回当前目录: ('.') os.pardir 获取当前目录的父目录字符串名:('..') os.makedirs('dirname1/dirname2') 可生成多层递归目录 os.removedirs('dirname1') 若目录为空,则删除,并递归到上一级目录,如若也为空,则删除,依此类推 os.mkdir('dirname') 生成单级目录;相当于shell中mkdir dirname os.rmdir('dirname') 删除单级空目录,若目录不为空则无法删除,报错;相当于shell中rmdir dirname os.listdir('dirname') 列出指定目录下的所有文件和子目录,包括隐藏文件,并以列表方式打印 os.remove() 删除一个文件 os.rename("oldname","newname") 重命名文件/目录 os.stat('path/filename') 获取文件/目录信息 os.sep 输出操作系统特定的路径分隔符,win下为"\\",Linux下为"/" os.linesep 输出当前平台使用的行终止符,win下为"\t\n",Linux下为"\n" os.pathsep 输出用于分割文件路径的字符串 win下为;,Linux下为: os.name 输出字符串指示当前使用平台。win->'nt'; Linux->'posix' os.system("bash command") 运行shell命令,直接显示 os.environ 获取系统环境变量 os.path.abspath(path) 返回path规范化的绝对路径 os.path.split(path) 将path分割成目录和文件名二元组返回 os.path.dirname(path) 返回path的目录。其实就是os.path.split(path)的第一个元素 os.path.basename(path) 返回path最后的文件名。如何path以/或\结尾,那么就会返回空值。即os.path.split(path)的第二个元素 os.path.exists(path) 如果path存在,返回True;如果path不存在,返回False os.path.isabs(path) 如果path是绝对路径,返回True os.path.isfile(path) 如果path是一个存在的文件,返回True。否则返回False os.path.isdir(path) 如果path是一个存在的目录,则返回True。否则返回False os.path.join(path1[, path2[, ...]]) 将多个路径组合后返回,第一个绝对路径之前的参数将被忽略 os.path.getatime(path) 返回path所指向的文件或者目录的最后存取时间 os.path.getmtime(path) 返回path所指向的文件或者目录的最后修改时间 os.path.getsize(path) 返回path的大小
import os # os.rename() # os.remove() # os.path.dirname() # print(os.environ)#待查看用法 # print(os.path.abspath(r"a\b\c\d.txt")) # print(os.path.split(r'D:\a\b\c.txt')) # print(os.path.dirname(r'D:\a\b\c.txt')) # print(os.path.basename(r'D:\a\b\c.txt')) # print(os.path.exists(r"D:\全栈18期\day17\代码\02 时间模块.py")) # print(os.path.exists(r"D:\全栈18期\day17\代码")) # print(os.path.isdir(r"D:\全栈18期\day17\代码")) # print(os.path.isfile(r"D:\全栈18期\day17\代码")) # BASE_DIR = os.path.dirname(os.path.dirname(__file__)) # LOG_PATH = r'%s\logs\access.log' % BASE_DIR # # print(os.path.join(BASE_DIR,'logs','access.log')) # print(os.path.getsize(r'D:\全栈18期\day17\代码\04 os模块.py')) # print(os.listdir('.') ) res = os.system("tasklist") print('===========>',res)
import subprocess obj = subprocess.Popen("taskliasdfst", shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE, ) print(obj) res1 = obj.stdout.read().decode('gbk') res2 = obj.stderr.read().decode('gbk')
四、sys模块
1 sys.argv 命令行参数List,第一个元素是程序本身路径 2 sys.exit(n) 退出程序,正常退出时exit(0) 3 sys.version 获取Python解释程序的版本信息 4 sys.maxint 最大的Int值 5 sys.path 返回模块的搜索路径,初始化时使用PYTHONPATH环境变量的值 6 sys.platform 返回操作系统平台名称
import sys # print(sys.argv) # src_file = input("请输入源文件路径>>>:").strip() # dst_file = input("请输入目标文件路径>>>:").strip() src_file = sys.argv[1] dst_file = sys.argv[2] # print(src_file) # print(dst_file) with open(r'%s' %src_file,mode='rb') as f1,open(r'%s' %dst_file,mode='wb') as f2: for line in f1: f2.write(line)
五、shutil 模块
将文件内容拷贝到另一个文件中shutil.copyfileobj(fsrc, fdst[, length])
1 import shutil 2 3 shutil.copyfileobj(open('old.xml','r'), open('new.xml', 'w'))
拷贝文件shutil.copyfile(src, dst)
shutil.copyfile('f1.log', 'f2.log') #目标文件无需存在
仅拷贝权限。内容、组、用户均不变shutil.copymode(src, dst)
shutil.copymode('f1.log', 'f2.log') #目标文件必须存在
仅拷贝状态的信息,包括:mode bits, atime, mtime, flags shutil.copystat(src, dst)
shutil.copystat('f1.log', 'f2.log') #目标文件必须存在
拷贝文件和权限shutil.copy(src, dst)
1 import shutil 2 3 shutil.copy('f1.log', 'f2.log')
拷贝文件和状态信息shutil.copy2(src, dst)
1 import shutil 2 3 shutil.copy2('f1.log', 'f2.log')
shutil.ignore_patterns(*patterns)
shutil.copytree(src, dst, symlinks=False, ignore=None)
递归的去拷贝文件夹
1 import shutil 2 3 shutil.copytree('folder1', 'folder2', ignore=shutil.ignore_patterns('*.pyc', 'tmp*')) #目标目录不能存在,注意对folder2目录父级目录要有可写权限,ignore的意思是排除
递归的去删除文件shutil.rmtree(path[, ignore_errors[, onerror]])
1 import shutil 2 3 shutil.rmtree('folder1')
递归的去移动文件,它类似mv命令,其实就是重命名。shutil.move(src, dst)
1 import shutil 2 3 shutil.move('folder1', 'folder3')
将 /data 下的文件打包放置当前程序目录 import shutil # ret = shutil.make_archive('./xxx', 'gztar', root_dir=r'D:\全栈18期\day17\代码\ATM')
tarfile解压缩 import tarfile t=tarfile.open("xxx.tar.gz",'r') t.extractall('./aaa') t.close()
六、 json&pickle模块
# 序列化 # 内存中的数据类型------序列化-------》格式 # 内存中的数据类型《------反序列化-------格式 # 作用: # 1、存档---》pickle # 2、跨平台交互数据---》json # =====================================>json兼容所有语言,但是不支持所有的python数据类型 # ====================> dumps--->loads # import json # # str_json = json.dumps({"x":1,'y':2,'z':True,'a':None}) # print(str_json) # # dic = json.loads(str_json) # print(dic) # ====================> dump--->load # import json # json.dump({"x":1,'y':2,'z':True,'a':None},open('a.json',mode='wt',encoding='utf-8')) # dic = json.load(open('a.json',mode='rt',encoding='utf-8')) # print(dic)
七、shelve模块
import shelve # 序列化 # f = shelve.open(r'sheve.txt') # f['stu1_info'] = {'name': 'EGON', 'age': 28, 'hobby': ['piao', 'smoking', 'drinking']} # f['stu2_info'] = {'name': 'gangdan', 'age': 53} # f['school_info'] = 123123123123123123123123123 # f['test'] = {1,2,3,4,5} # # # print(f['stu1_info']['hobby']) # f.close() # 反序列化 import shelve f=shelve.open(r'sheve.txt') # print(f['stu1_info']['name']) # print(f['school_info']) print(f['test']) f.close()
八、猴子补丁
import json # ujson import ujson def monkey_patch(): json.loads = ujson.loads json.dumps = ujson.dumps monkey_patch()
九、configparser模块
import configparser config = configparser.ConfigParser() config.read('config.ini') # res = config.sections() # print(res) # res = config.options('section1') # print(res) # res = config.items('section1') # print(res) # res = config.get('section1','is_admin') # res = bool(res) # res = config.getboolean('section1','is_admin') # print(res,type(res)) # res = config.get('section1','salary') # res = config.getfloat('section1','salary') res = config.getint('section1','salary') print(res,type(res))
十、hashlib模块
# hash值有三大特点: # 1、只要传入的原材料一样、并且hash算法一样,那么得到的hash值一定是一样的 # 2、hash值的长度取决于hash算法,与传入的内容大小无关 # 3、hash值不可逆 # 1+2==》文件完整性校验 import hashlib with open(r'D:\全栈18期\day17\视频\01 日志模块.mp4',mode='rb') as f: m = hashlib.md5() for line in f: m.update(line) print(m.hexdigest()) # 3====》加密 import hashlib # m = hashlib.md5() # m.update("hello".encode('utf-8')) # m.update("w".encode('utf-8')) # m.update("orld".encode('utf-8')) # "helloworld" # # print(m.hexdigest()) # # # m1 = hashlib.md5() # m1.update("he".encode('utf-8')) # m1.update("llo".encode('utf-8')) # m1.update("world".encode('utf-8')) # "helloworld" # # print(m1.hexdigest()) # m1 = hashlib.md5() # m1.update("he".encode('utf-8')) # m1.update("llo".encode('utf-8')) # m1.update("world".encode('utf-8')) # "helloworld" # print(m1.hexdigest()) # pwd = '123' # # m = hashlib.md5() # m.update("天王盖地虎".encode('utf-8')) # m.update(pwd.encode('utf-8')) # m.update("小鸡炖蘑菇".encode('utf-8')) # print(m.hexdigest()) #
十一、subprocess模块
import subprocess obj = subprocess.Popen("taskliasdfst", shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE, ) print(obj) res1 = obj.stdout.read().decode('gbk') res2 = obj.stderr.read().decode('gbk')
十二、logging模块
日志级别
CRITICAL = 50 #FATAL = CRITICAL ERROR = 40 WARNING = 30 #WARN = WARNING INFO = 20 DEBUG = 10 NOTSET = 0 #不设置
默认级别为warning,默认打印到终端
import logging logging.debug('调试debug') logging.info('消息info') logging.warning('警告warn') logging.error('错误error') logging.critical('严重critical') ''' WARNING:root:警告warn ERROR:root:错误error CRITICAL:root:严重critical
Logger与Handler的级别
logger是第一级过滤,然后才能到handler,我们可以给logger和handler同时设置level,但是需要注意的是
common模块
import time import logging.config from conf import settings # def log(msg): # # with open(r'%s' % settings.LOG_PATH,mode='at',encoding='utf-8') as f: # f.write("%s %s\n" % (time.strftime("%Y-%m-%d %H:%M:%S"),msg)) # logging.config.dictConfig(settings.LOGGING_DIC) def log(msg,name,level='info'): logger = logging.getLogger(name) if level == 'info': logger.info(msg) elif level == 'warn': logger.warning(msg) elif level == 'error': logger.error(msg) elif level == 'critical': logger.critical(msg)
setting模块
import os BASE_DIR = os.path.dirname(os.path.dirname(__file__)) LOG_PATH = r'%s\logs\access.log' % BASE_DIR LOGGING_DIC = { 'version': 1, 'disable_existing_loggers': False, 'formatters': { '格式1': { 'format': '%(asctime)s %(name)s %(filename)s:%(lineno)d %(levelname)s:%(message)s' }, '格式2': { 'format': '%(asctime)s :%(message)s' }, }, 'filters': {}, 'handlers': { '屏幕': { 'level': 'DEBUG', 'class': 'logging.StreamHandler', # 打印到屏幕 'formatter': '格式2' }, '文件': { 'level': 'DEBUG', 'class': 'logging.FileHandler', # 保存到文件 'formatter': '格式1', 'filename': LOG_PATH, 'encoding': 'utf-8', }, }, 'loggers': { # '交易日志': { # 'handlers': ['屏幕','文件'], # 'level': 'DEBUG', # 'propagate': False, # }, '': { 'handlers': ['屏幕','文件'], 'level': 'DEBUG', 'propagate': False, }, }, }
src模块
def logout(): print("退出".center(50,'*')) exit() def login(): print('登录'.center(50,'*')) log("egon刚刚登录了","登录日志","info") def register(): print('注册'.center(50,'*')) def transfer(): print('转账'.center(50,'*')) log("egon刚刚给刘sir转了10个亿","交易日志",'info') def withdraw(): print('提现'.center(50,'*')) log("egon提现了10个亿","交易日志",'info') def pay(): print('支付'.center(50,'*')) log('egon支出失败',"交易日志",'error') func_dic = { '0': ['退出',logout], '1': ['登录',login], '2': ['注册',register], '3': ['转账',transfer], '4': ['提现',withdraw], '5': ['支付',pay], } def run(): while True: for k in func_dic: print(k,func_dic[k][0]) choice = input("请输入指令编号: ").strip() if choice in func_dic: func_dic[choice][1]() else: print("输入的指令错误")