复习----常用模块

本节内容

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"。有了原生字符串,你再也不用担心是不是漏写了反斜杠,写出来的表达式也更直观。

猜你喜欢

转载自www.cnblogs.com/Yan-night/p/11252083.html