本节内容
1.time & datetime模块
2.random模块
3.os模块
4.sys模块
5.json & picle模块
6.shelve模块
7configparser配置文件模块
8.hashilb模块
9.logging模块
10.re正则表达式
1.time & datetime模块
1 import time 2 3 print(time.time()) #1564120631.4106512 自生成开始至今的秒数 ***** 4 # time.sleep() #********休眠 5 print(time.clock()) #4.4444385185264197e-07 科学计数法,cpu执行时间 6 print(time.gmtime()) #英国时间,世界标准时间time.struct_time(tm_year=2019, tm_mon=7, tm_mday=26, tm_hour=5, tm_min=57, tm_sec=11, tm_wday=4, tm_yday=207, tm_isdst=0) 7 print(time.localtime())#本地时间 ******** tm_hour=13 8 9 struct_time=time.localtime() 10 print(time.strftime(‘%Y--%m--%d %H:%M:%S‘,struct_time))#自定义时间格式 ********** 11 #输出 2019--07--26 13:57:11 12 13 print(time.strptime(‘2019--03--21 22:43:13‘,‘%Y--%m--%d %H:%M:%S‘)) # *********** 14 #输出 time.struct_time(tm_year=2019, tm_mon=3, tm_mday=21, tm_hour=22, tm_min=43, tm_sec=13, tm_wday=3, tm_yday=80, tm_isdst=-1) 15 16 a=time.strptime(‘2019--07--26 13:59:22‘,‘%Y--%m--%d %H:%M:%S‘) #方便提取 17 print(a.tm_year) #2019 18 print(a.tm_mday) #26 19 print(a.tm_wday) #4 20 21 print(time.ctime()) #Fri Jul 26 13:59:52 2019 可加时间戳,叠加时间 22 print(time.mktime(time.localtime())) #1564120792.0 转化时间戳 23 24 25 import datetime 26 27 print(datetime.datetime.now()) # 2019-07-26 13:59:52.964966 28 29 print(datetime.date.fromtimestamp(time.time()) ) # 时间戳直接转成日期格式 2019-07-26 30 print(datetime.datetime.now() ) 31 print(datetime.datetime.now() + datetime.timedelta(3)) #当前时间+3天 32 print(datetime.datetime.now() + datetime.timedelta(-3)) #当前时间-3天 33 print(datetime.datetime.now() + datetime.timedelta(hours=3)) #当前时间+3小时 34 print(datetime.datetime.now() + datetime.timedelta(minutes=30)) #当前时间+30分 35 36 c_time = datetime.datetime.now() 37 print(c_time.replace(minute=3,hour=2)) #时间替换
2.random模块
1 import random 2 3 print(random.random()) # 0-1间生成随机数 4 print(random.randint(1,8)) # 包括8 5 print(random.randrange(1,3)) # 不包括3 6 7 print(random.choice(‘hello‘)) 8 print(random.choice([‘123‘,4,[1,2]])) 9 10 print(random.sample([‘123‘,4,[1,2]],2)) #随机选多个值 11 12 print(chr(65)) #ASII码数转换成字母 13 14 15 #生成验证码 16 def v_code(): 17 code=‘‘ 18 19 for i in range(5): 20 random_add = random.choice([random.randrange(10), chr(random.randrange(65, 90))]) 21 # if i==random.randrang(0,5): 22 # add_num=random.randrange(10) 23 # random_add=chr(random.randrange(65,90)) 24 code+=str(random_add) 25 print(code) 26 27 v_code()
3.os模块
提供对操作系统进行调用的接口
1 import os 2 3 print(os.getcwd()) #当前工作目录C:\Users\Yan\PycharmProjects\fullstack_s2\18 4 # os.chdir(r‘C:\Users\Yan\PycharmProjects\fullstack_s2‘) #改变当前目录 5 6 print(os.curdir) # . 返回当前目录 7 print(os.pardir) # .. 返回当前目录父级目录 8 9 print(os.makedirs(‘abc\\a\\b\\c‘)) #递归生成文件夹 10 print(os.removedirs(‘abc\\a\\b\\c‘)) #删除 空 文件夹 11 12 os.mkdir(‘dirname‘) #生成单个文件夹 13 os.rmdir(‘dirname‘) #删除单个空文件夹 14 15 print(os.listdir(r‘C:\Users\Yan\PycharmProjects\fullstack_s2\18‘)) #列出指定目录下的所有文件和子目录,包括隐藏文件,并以列表方式打印 16 [‘example.ini‘, ‘hashlib模块.py‘, ‘i.ini‘, ‘logging模块.py‘, ‘os模块.py‘, ‘sys模块.py‘, ‘test.log‘, ‘test1.log‘, ‘__init__.py‘, ‘正则表达式.py‘, ‘配置文件模块.py‘] 17 18 os.remove(‘‘) #只能删文件,不能删文件夹 19 os.rename(‘oldname‘,‘newname‘) #重命名 20 21 info=os.stat(‘.\\os模块.py‘) #获取该文件/目录 结构化信息 22 #os.stat_result(st_mode=33206, st_ino=20266198323286158, st_dev=272764838, st_nlink=1, st_uid=0, st_gid=0, st_size=817, st_atime=1553435864, st_mtime=1553435864, st_ctime=1553433591) 23 print(info.st_size) #获取文件大小 24 25 print(os.sep) #当前系统下特定的路径分隔符 Linux用/ Windows用\ 26 print(os.pathsep) #输出用于分割文件路径的字符串 27 os.name #输出字符串指示当前使用平台。win->‘nt‘; Linux->‘posix‘ 28 29 print(os.path.abspath(‘./os模块.py‘)) #取绝对路径 30 31 print(os.path.split(r‘C:\Users\Yan\PycharmProjects\fullstack_s2\18\os模块.py‘)) #分割路径与文件,取决于最后一个 \ 32 print(os.path.dirname(r‘C:\Users\Yan\PycharmProjects\fullstack_s2\18\os模块.py‘)) #返回path的目录。其实就是os.path.split(path)的第一个元素 33 os.path.basename(r‘C:\Users\Yan\PycharmProjects\fullstack_s2\18\os模块.py‘) #返回path最后的文件名。如何path以/或\结尾,那么就会返回空值。即os.path.split(path)的第二个元素 34 35 os.path.join(path1[, path2[, ...]])#拼接路径名字 36 os.path.exists(path) #如果path存在,返回True;如果path不存在,返回False 37 os.path.isabs(path) #如果path是绝对路径,返回True 38 os.path.isfile(path) #如果path是一个存在的文件,返回True。否则返回False 39 os.path.isdir(path) #如果path是一个存在的目录,则返回True。否则返回False
4.sys模块
1 import sys 2 3 print(sys.argv) #命令行参数List,第一个元素是程序本身路径 4 # sys.exit(n) # 退出程序,正常退出时exit(0) 5 print(sys.version) #获取Python解释程序的版本信息 6 # print(sys.maxint) #最大的Int值 7 print(sys.path) #返回模块的搜索路径,初始化时使用PYTHONPATH环境变量的值 8 print(sys.platform) #返回操作系统平台名称 9 print(sys.path) #返回木块的搜索路径,初始化时使用PYTHONPATH环境变量
5.json & picle模块
用于序列化的两个模块
·json,用于字符串和python数据类型间进行转换
·pickle,用于python特有的类型和python的数据类型间进行转换
json模块提供了四个功能:dumps、dump、loads、load
pickle模块提供了四个功能:dumps、dump、loads、load
1 import json 2 3 #dumps 将数据通过特殊的形式转换为所有语言程序都认识的字符串 4 dic={‘name‘:‘ruioly‘,‘age‘:‘20‘} 5 6 data=json.dumps(dic) #转换成JSON支持的字典形式 7 #比eval()支持范围更广 8 f = open(‘test‘,‘w‘) 9 f.write(data) 10 f.close() 11 12 #loadsf = open(‘test‘,‘r‘) 13 data=f.read() 14 data=json.loads(data) #与json.dumps()成对 15 print(data[‘name‘]) 16 f.close() 17 18 19 #dump 将数据通过特殊的形式转换为所有语言程序都认识的字符串,并写入文件 20 dic={‘name‘:‘ruioly‘,‘age‘:‘20‘} 21 f=open(‘test2‘,‘w‘) 22 json.dump(dic,f) #省去f.wirte() 23 f.close() 24 25 #load 26 f=open(‘test2‘,‘r‘) 27 data=json.load(f) #省去f.read() 28 print(data[‘name‘])
1 import pickle 2 3 def foo(): 4 print(‘ok‘) 5 6 data = pickle.dumps(foo) #json模块序列化的数据 更通用,不可序列号函数 7 #picle模块序列化的数据 仅python可用,但功能强大,可以序列号函数 8 #json与pickle 用法相差不大
6.shelve模块
shelve模块是一个简单的k,v将内存数据通过文件持久化的模块,可以持久化任何pickle可支持的python数据格式
1 f=shelve.open(‘SHELVE_text‘) 2 3 f[‘info‘]={‘name‘:‘alex‘,‘age‘:‘18‘} #存储 持久化列表 4 f[‘shopping‘]={‘name‘:‘alex‘,‘price‘:‘-1000‘} 5 6 print(f.get(‘info‘)) #提取 7 print(f.get(‘shopping‘)) #提取 8 f.close()
7configparser配置文件模块
用于生成和修改常见配置文档,当前模块的名称在 python 3.x 版本中变更为 configparser。
常见文档格式如下
1 [DEFAULT] 2 ServerAliveInterval = 45 3 Compression = yes 4 CompressionLevel = 9 5 ForwardX11 = yes 6 7 [bitbucket.org] 8 User = hg 9 10 [topsecret.server.com] 11 Port = 50022 12 ForwardX11 = no
如果想用python生成一个这样的文档怎么做呢?
1 import configparser 2 3 config = configparser.ConfigParser() 4 5 config[‘DEFAULT‘]={‘ServerAliveInterval‘:‘45‘, 6 ‘Compression‘:‘yes‘, 7 ‘CompressionLevel‘:‘9‘} 8 9 config[‘bitbucket.org‘] = {} 10 config[‘bitbucket.org‘][‘User‘]=‘hg‘ 11 config[‘topsecret.server.com‘]={} 12 topsecret = config[‘topsecret.server.com‘] 13 topsecret[‘Host Port‘] = ‘50022‘ 14 topsecret[‘DorwardX11‘] = ‘no‘ 15 config[‘DEFAULT‘][‘ForwardX11‘] = ‘yes‘ 16 17 with open(‘example.ini‘,‘w‘) as configfile: 18 config.write(configfile)
configparser的一些操作
1 config.read(‘i.ini‘) #读取 2 print(config.sections()) 3 print(config.defaults()) 4 # 5 for key in config[‘bitbucket.org‘]: #DUFAULT默认取出 6 print(key) 7 8 config.remove_section(‘topsecret.server.com‘) 9 # 删除即重新覆盖 10 11 config.set(‘topsecret.server.com‘,‘dorwardx11‘,‘yes‘) #改值 12 13 config.remove_option(‘bitbucket.org‘,‘user‘) #删 14 15 config.write(open(‘i.ini‘,‘w‘))
8.hashilb模块
用于加密相关的操作,3.x里代替了md5模块和sha模块,主要提供 SHA1, SHA224, SHA256, SHA384, SHA512 ,MD5 算法
1 import hashlib 2 3 m=hashlib.md5() 4 print(m) # <md5 HASH object @ 0x00000238C104C3A0> 5 # 6 m.update(‘hello world‘.encode("utf-8")) 7 print(m.hexdigest()) #密文 5eb63bbbe01eeed093cb22bb8f5acdc3 8 # 9 m.update(‘alex‘.encode("utf-8")) #删除掉上面那条,新建了一条“hello worldalex”的密文 10 print(m.hexdigest()) # 82bb8a99b05a2d8b0de2ed691576341a 11 # 12 m2=hashlib.md5() 13 m2.update(‘hello worldalex‘.encode("utf-8")) #调用已有的密文 14 print(m2.hexdigest()) # 82bb8a99b05a2d8b0de2ed691576341a 15 16 #密文无法逆转,只可撞库,一一匹配 17 s=hashlib.sha256() 18 s.update(‘hello world‘.encode(‘utf-8‘)) 19 print(s.hexdigest()) 20 # b94d27b9934d3e08a52e52d7da7dabfac484efe37a5380ee9088f7ace2efcde9
9.logging模块
很多程序都有记录日志的需求,并且日志中包含的信息即有正常的程序访问日志,还可能有错误、警告等信息输出,python的logging模块提供了标准的日志接口,你可以通过它存储各种格式的日志,logging的日志可以分为 debug()
, info()
, warning()
, error()
and critical() 5个级别,
看一下这几个日志级别分别代表什么意思
Level | When it’s used |
---|---|
DEBUG |
Detailed information, typically of interest only when diagnosing problems. 详细信息,通常只有在诊断问题时才感兴趣。 |
INFO |
Confirmation that things are working as expected. 确认事情按预期进行 |
WARNING |
An indication that something unexpected happened, or indicative of some problem in the near future (e.g. ‘disk space low’). The software is still working as expected. 表示发生了意外事件,或表示近期出现了问题(如“磁盘空间不足”)。软件仍按预期工作 |
ERROR |
Due to a more serious problem, the software has not been able to perform some function. 由于更严重的问题,软件无法执行某些功能。 |
CRITICAL |
A serious error, indicating that the program itself may be unable to continue running. 一个严重错误,表明程序本身可能无法继续运行。 |
1 import logging 2 3 #分级别,第一种形式输出,放映屏幕 4 logging.debug(‘debug message‘) 5 logging.info(‘info message‘) 6 logging.warning(‘warning message‘) 7 logging.error(‘error message‘) 8 logging.critical(‘critical message‘) 9 10 #第二种形式输出,存入文档,若无filename参数,则默认第一种形式输出 11 logging.basicConfig(level=logging.DEBUG, 12 format=‘%(asctime)s %(filename)s [line:%(lineno)d] %(levelname)s %(message)s‘, 13 datefmt=‘%a,%d %b %Y %H:%M:%S‘, 14 filename=‘test.log‘, 15 filemode=‘w‘) 16 # format(指定handler使用的日志格式) filename(文件名路径位置) filemode(打开方式,默认为‘a‘) 17 18 #Fri,29 Mar 2019 10:55:34 logging???.py [line:19] DEBUG debug message 19 logging.debug(‘debug message‘) 20 logging.info(‘info message‘) 21 logging.warning(‘warning message‘) 22 logging.error(‘error message‘) 23 logging.critical(‘critical message‘) 24 25 26 ##logger 可两种形式输出 27 logger=logging.getLogger() 28 29 fh=logging.FileHandler(‘test1.log‘) #创建一个handler,用于写入日志文件 30 31 ch=logging.StreamHandler() #创建一个handler,用于输出到控制台 32 33 formatter=logging.Formatter(‘%(asctime)s %(filename)s [line:%(lineno)d] %(levelname)s %(message)s‘) 34 # 日志格式 %(name)s-Logger的名字 %(levelno)s-数字形式的日志级别 %(levelname)s-文本形式的日志级别 %(pathname)s-调用日志输出函数的模块的完整路径名,可能没有 35 # %(filename)s-调用日志输出函数的模块的文件名 %(module)s-调用日志输出函数的模块名 %(funcName)s-调用日志输出函数的函数名 36 # %(asctime)s-字符串形式的当前时间。默认格式是 “2003-07-08 16:49:45,896”。逗号后面的是毫秒 37 38 fh.setFormatter(formatter) #取一个格式对象 39 ch.setFormatter(formatter) 40 41 logger.addHandler(fh) 42 logger.addHandler(ch) #默认级别从warning开始 43 44 logger.setLevel(logging.DEBUG) #调整级别 45 logger.debug(‘logger debug message‘) 46 logger.info(‘logger info message‘) 47 logger.warning(‘logger warning message‘) 48 logger.error(‘logger error message‘) 49 logger.critical(‘logger critical message‘)
Python 使用logging模块记录日志涉及四个主要类,使用官方文档中的概括最为合适:
logger提供了应用程序可以直接使用的接口;
handler将(logger创建的)日志记录发送到合适的目的输出;
filter提供了细度设备来决定输出哪条日志记录;
formatter决定日志记录的最终输出格式。
10.re正则表达式
1 import re 2 3 # findall():所有结果都返回到一个列表里 4 # search():返回一个对象(object),对象可以调用group()返回结果 5 # match():只在字符串开始匹配匹配,也返回匹配到的第一个对象 6 # split():分割 7 # sub():替换 8 # compile():重复调用规则 9 10 obj=re.compile(‘\.com‘) 11 ret=obj.findall(‘fasdhq.comwrh‘) 12 print(ret) # [‘.com‘] 13 14 ret=re.sub(‘a..x‘,‘s.....b‘,‘asdqetrsalexgser‘) 15 print(ret) # asdqetrss.....bgser 16 17 ret=re.split(‘[k,d]‘,‘djkasdl‘) 18 print(ret) #[‘‘, ‘j‘, ‘as‘, ‘l‘] 19 20 ret=re.findall(‘w\w{3}d‘,‘hello world‘) 21 print(ret) # [‘world‘] 22 23 ret1=re.findall(‘w...d‘,‘hello world‘) #点(.)只能代指一个字符,不能换行 24 print(ret1) 25 26 # search 只找一个,返回一个对象 27 ret=re.search(‘sb‘,‘asfdasffsbqweqwrsb‘) 28 print(ret) #<_sre.SRE_Match object; span=(8, 10), match=‘sb‘> 29 print(ret.group()) #显示匹配的第一个结果 30 31 32 # 元字符 (. ^ $ * + ? [] | \ ()) 33 34 # . 通配符 35 ret=re.findall(‘w..l‘,‘hello w\t ld‘) 36 print(ret) 37 38 # ^ 尖角符 只在开始匹配 39 ret=re.findall(‘^h...o‘,‘hjasofghello‘) 40 print(ret) 41 42 # $ 从结尾匹配 43 ret=re.findall(‘a..x$‘,‘hasdhawhreqwehauyx‘) 44 print(ret) 45 46 # * 重复匹配 重复前一字符的个数(0-oo) 47 ret=re.findall(‘a.*li‘,‘asfdasfalexlifasdasdqw‘) 48 print(ret) 49 50 # + 重复,从1开始[1,+oo] 51 ret=re.findall(‘ab+‘,‘qweqweasdah‘) 52 print(ret) 53 54 # ? [0,1]有0或1个前一字符 55 ret = re.findall(‘a?b‘,‘aaaaabhdgheabfb‘) 56 print(ret) 57 58 # {} 可取任意个数 59 ret=re.findall(‘a{1,5}b‘,‘aabb‘) 60 print(ret) 61 62 # [] 字符集 可取消元字符的特殊功能(三个例外:\ ^ -) 63 ret=re.findall(‘a[c,d,e]x‘,‘adxf‘) #三选一 64 print(ret) 65 ret=re.findall(‘[a-z]‘,‘adx‘) #范围 66 print(ret) 67 ret=re.findall(‘[w,*,,]‘,‘wfasd*asd,.‘) 68 print(ret) 69 ret=re.findall(‘[^t]‘,‘wqetadsfg‘) #(取反)取除了t以外的字符 70 print(ret) 71 72 # \ 73 # 反斜杠后边跟元字符,则去除特殊功能 74 # 反斜杠后面跟普通字符,则实现特殊功能 75 # (\d匹配[0-9] \D[^0-9] , \s匹配任何空白字符[\t \n \r \f \v] , \S非 , 76 # \w匹配任何字母数字字符, \W ,\b匹配与特殊字符的边界) 77 78 print(re.findall(‘\d{11}‘,‘fasf12434255345213‘)) 79 print(re.findall(‘\sasd‘,‘fasd asd‘)) 80 print(re.findall(‘\wasd‘,‘asd wasd‘)) 81 print(re.findall(r‘\bI\b‘,‘hello ,I am a LIST‘)) 82 83 # () | 84 print(re.search(‘(as)+‘,‘dfqweasas‘).group()) # asas 85 print(re.search(‘(as)|3‘,‘ase3‘).group()) # as 86 87 ret=re.search(‘(?P<id>\d{3})/(?P<name>\w{3})‘,‘wwwee34ttt123/000‘) 88 print(ret.group()) # 123/000 89 print(ret.group(‘id‘)) # 123 90 print(ret.group(‘name‘)) # 000
反斜杠的困扰
与大多数编程语言相同,正则表达式里使用"\"作为转义字符,这就可能造成反斜杠困扰。假如你需要匹配文本中的字符"\",那么使用编程语言表示的正则表达式里将需要4个反斜杠"\\\\":前两个和后两个分别用于在编程语言里转义成反斜杠,转换成两个反斜杠后再在正则表达式里转义成一个反斜杠。Python里的原生字符串很好地解决了这个问题,这个例子中的正则表达式可以使用r"\\"表示。同样,匹配一个数字的"\\d"可以写成r"\d"。有了原生字符串,你再也不用担心是不是漏写了反斜杠,写出来的表达式也更直观。
原文:https://www.cnblogs.com/Yan-night/p/11252083.html