15.02 模块

目录:

补充:猴子补丁

 

 

 

 

 

一、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("输入的指令错误")

 

 

 

 

posted @ 2021-08-16 20:10  甜甜de微笑  阅读(38)  评论(0编辑  收藏  举报