python_day18_复习_os模块_sys模块_加密hashlib模块_logging日志模块_config配置文件模块_re正则表达式模块

只想说,2018年的十一假期就这样过去了,在实验室呆了六天,在西湖呆了一天,于是博客好几天没更新,就不多写了,得赶快回宿舍了不是。。。

01 复习

#Author:"haijing"

#date:2018/10/5
#列表生产式:
a = [x*2 for x in range(10)]
print(a) #[0, 2, 4, 6, 8, 10, 12, 14, 16, 18]
#生成器(generater)
# 创建生成器方式一:
# (x*2 for x in range(10))
# 创建生成器方式二:
# def f():
# yield #其后面可以有返回值也可以没有
# 此时f()就是一个生成器
next(f()) #计算出一个值,即yield后的返回值

# for循环内部做了三件事:
# 1)调用对象的iter()方法,返回一个迭代器对象
# 2)通过一个while循环:while:
# try:
# next(list_Iterator)
# except StopIteration:
# break

#send():给add = yield 的add传参数,但是第一次send()的时候不能传参数
# def f():
# print('hello world')
# a = yield 2 #其后面可以有返回值也可以没有
# f().send(None) #第一次send()的时候不能传参数,此时等价于next(f())
# f().send('ok')

# 迭代器:
# 1 内部有next方法
# 2 内部有iter()方法
li = [1,2,3]
i = iter(li) #迭代器i

chr()#把一个数字转换成字母

02os模块
#Author:"haijing"
#date:2018/10/5

import os
print(os.getcwd()) #打印day18的目录D:\PyCharmPro\pro02\week03\day18
# print(os.chdir(r'C:\Users')) #改变当前的工作目录为C:\User,r先不管
print(os.curdir) #显示当前目录,打印一个点
print(os.pardir) #返回上一层目录,打印两个点
# os.makedirs('abc\\haijing\\he') #在当前目录(day18)下创建两级目录abc\haijing,也可以生成更多级的
#刚刚因为没有注释掉第六句,所以报错了,因为day18是在D:\PyCharmPro\pro02\week03\day18目录下,
#第6句已经将目录改到了c盘,所以会报错

# os.chdir(r'C:\Users')
# os.makedirs('abc\\haijing\\he') #是打算在C:\Users下创建文件夹这两句有问题

# dirs = os.listdir(r'D:\PyCharmPro\pro02\week03\day18')
# print(dirs) #['01复习.py', '02os模块.py']
#加一个r是为了防止出现类似\n的含义,只要加了r后面的就都是字符串,没有别的意思了
# os.remove(oo.py) #只能删除文件,不能删除文件夹
# os.rename(oldname,newname)

info = os.stat('D:\PyCharmPro\pro02\week03\day18') #info就是一个对象
print(info) #os.stat_result(st_mode=16895, st_ino=678354693872687456, st_dev=1879755873, st_nlink=1, st_uid=0, st_gid=0, st_size=0, st_atime=1538747533, st_mtime=1538747533, st_ctime=1538741647)
print(info.st_size) #获取day18这个文件夹的大小
print(info.st_atime) #1538747672.7753518 获取上一次被人修改的时间

# windows下用\进行路径的拼接 Linux下用/
print(os.sep) #打印当前系统环境下的目录分隔符

#在windows下用\r\n进行换行 在Linux下用\n进行换行

# print(os.system('D:\PyCharmPro\pro02\week03\day18')) #查看 D:\PyCharmPro\pro02\week03\day18下的文件
print(os.path.abspath('./day18')) #返回day18的绝对路径D:\PyCharmPro\pro02\week03\day18\day18
#day18位相对路径

print(os.path.dirname('day18'))

os.path.join(a,b) #将路径a和路径b的绝对路径加在一起

03 sys模块
#Author:"haijing"
#date:2018/10/5
# sys是在跟python解释器进行交互

import sys
#在dos环境下执行03sys模块.py时,可以在后面跟参数,打印的话会以列表的形式打印出03sys模块.py和传的参数
#例如:在dos下输入D:\PyCharmPro\pro02\week03\day18\day18\03sys模块.py post path
#即打印[03sys模块.py,post,path]
# print(sys.argv)
# def post(): #上传函数
# print('ok')
#
# def download(): #下载函数
# print('ok')
#
# if sys.argv[1]=='post':
# post()
# elif sys.argv[1]=='download':
# download()

# print(sys.path)
# print(sys.path.append('需要添加的路径'))
print(sys.platform) #win32 表明是windows系统
if sys.platform == 'win32': #如果是在windows系统下
os.system('dir')
else: #否则是在Linux系统下
os.system('ls')

04 hashlib加密模块
#Author:"haijing"
#date:2018/10/6

#即加密模块,不可逆,但有人可以破解,但是破解者也是去撞,和要破解的去匹配
#md5就是一个加密算法
#在python3中字符串的类型都是unicode的类型,但是m.update('a')必须是一个字节类型(二进制数),所以需要encode()字符转换
#所写的hello world就是一个unicode(万国码)类型
import hashlib
m = hashlib.md5()
print(m) #<md5 HASH object @ 0x02A27698>对象的名字
m.update('hello world'.encode('utf8')) #对hello world进行加密,同时加.encode('utf8')是做一个字符转换
print(m.hexdigest()) #将hello world 加密为5eb63bbbe01eeed093cb22bb8f5acdc3,hexdigest是将加密之后的取出来方法

m.update('haijing'.encode('utf8')) #在加密hello world的基础上,再对haijing进行加密
print(m.hexdigest())

m2 = hashlib.md5()
m2.update('hello worldhaijing'.encode('utf8'))
print(m2.hexdigest())

m3 = hashlib.sha3_256() #sha3系列很多加密算法,但是sha3_256效率最高
m3.update('hello world'.encode('utf8'))
print(m3.hexdigest()) #644bcc7e564373040999aac89e7622f3ca71fba1d972fd94a31c3bfbf24e3938

05 logging日志模块
#Author:"haijing"
#date:2018/10/6

#日志:可以把所有操作命令记录下来

# import logging
#
# logging.basicConfig(level=logging.DEBUG,
# format='%(asctime)s %(filename)s[line:%(lineno)d] %(levelname)s %(message)s',
# datefmt='%a, %d %b %Y %H:%M:%S',
# filename='test.log',
# filemode='w')
# logging.debug('debug message') #因为级别不够,所以不打印
# logging.info('info message') #因为级别不够,所以不打印
# logging.warning('warning message') #其内容可以随意的改
# logging.error('error message')
# logging.critical('critical message')

#asctime、filename、lineno、levelname、message都是变量
#level级别此时已经设置到了最低的级别debug
#format格式
# datefmt='%a, %d %b %Y %H:%M:%S', 时间格式
#写的内容放在filename='/tmp/test.log'中
#在哪一行调用的日志记录,就会记录在lineno中
#levelname级别名字
# filemode='w'表示记录不会在显示在屏幕中,而是记录到'test.log'中去,会覆盖原有的记录
#filemode='a' 表示记录不会在显示在屏幕中,而是记录到'test.log'中去,不会覆盖原有的记录
#如果没有test.log,会在当前目录下自动创建一个test.log


#logger既能在屏幕上输出 也能在文件中记录
#logger也是放着logging里边的
import logging
logger = logging.getLogger() #取出logger对象
# 创建一个handler,用于写入日志文件
fh = logging.FileHandler('test.log') #文件输出流对象

# 再创建一个handler,用于输出到控制台
ch = logging.StreamHandler() #屏幕输出流对象

formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s') #标准流对象

#以上创建了四个对象,下面分别对这四个对象工作
fh.setFormatter(formatter) #让fh这个对象有一个输出格式
ch.setFormatter(formatter) #让ch这个对象有一个输出格式

logger.addHandler(fh) #logger对象可以添加多个fh和ch对象,logger这个对象有了fh(文件)输出方式
logger.addHandler(ch) #logger这个对象有了ch(屏幕)输出方式

logger.setLevel(logging.DEBUG) #设置记录级别

logger.debug('logger debug message123')#可以所以的更改显示的内容
logger.info('logger info message123')
logger.warning('logger warning message123')
logger.error('logger error message123')
logger.critical('logger critical message123')
#执行即可在屏幕和文件test.log中同时有操作记录,按照默认warning级别记录的
#所以没有debug的记录
# 在记录之前通过logger.setLevel(logging.Debug) 设置记录的最低级别为debug

06 config日志模块
#Author:"haijing"
#date:2018/10/6

#配置文件:一些经常需要被变更的信息被存储在配置文件中,以后经常需要修改的放在这里
#创建配置文件一
# import configparser
#
# config = configparser.ConfigParser() #config为可以增减删除的对象
#
# config["DEFAULT"] = {'ServerAliveInterval': '45',
#
# 'Compression': 'yes',
#
# 'CompressionLevel': '9'}

#创建配置文件二
#创建一个字典config,字典的第一个键为DEFAULT值为等号后的一个字典。
# config["DEFAULT"] 中DEFAULT为一个键,等号后边的是一个值,这个值用字典表示
# import configparser
# config = configparser.ConfigParser() #config为可以增减删除的对象
# config['bitbucket.org'] = {'User':'hg'} #字典cofig的第二个键和值 bitbucket.org:User':'hg
#一下四句相当于创建这样一个字典config['topsecret.server.com':{'Host Port':'50022','ForwardX11':'no'}]
# config['topsecret.server.com'] = {} #创建一个空字典
# topsecret = config['topsecret.server.com']
# topsecret['Host Port'] = '50022' # 相当于往创建的空字典config['topsecret.server.com']中添值 Host Port:50022
# topsecret['ForwardX11'] = 'no' # same here
#
# config['DEFAULT']['ForwardX11'] = 'yes'
#
# with open('example.ini', 'w') as configfile:
# config.write(configfile) #创建example.ini
#以上相当于创建字典:config{'bitbucket.org':{'User':'hg'},'topsecret.server.com':{'Host Port':50022,'ForwardX11':'no'},'DEFAULT':{'ForwardX11':'yes'}}


#删除配置文件中的某一部分
import configparser
config = configparser.ConfigParser() #一个新的config对象

config.read('example.ini') #关联上example.ini,config对象中就有东西了,所以可以读删
print(config.sections()) #打印example.ini中的键,但是不能打印DEFAULT(默认)
print(config.defaults()) #打印DEFAULT中的内容
print(config['bitbucket.org']['user']) #取值,打印hg

for key in config['bitbucket.org']:
print(key) #打印user、DEFAULT和topsecret.server.com中的forwardx11

#删除
config.remove_section('topsecret.server.com') #删除example.ini中的topsecret.server.com
config.write(open('i.cfg','w')) #生成删除了topsecret.server.com键和值的新文件i.cfg,原文件不动

#修改
config.set('bitbucket.org','user','haijing') #将example.ini下的{'bitbucket.org':{'user':'hg'}}的hg改为haijing


07 re正则表达式模块
#Author:"haijing"
#date:2018/10/7

# 正则表达式的作用:匹配字符串,所有的操作对象为字符串,和元组字典没有关系

# s = 'hello world'
# print(s.find('ll')) #返回
# ret = s.replace('ll','xx')
# print(ret) #打印hexxo world
# print(s.split('w')) #['hello ', 'orld']

#以上均为匹配,引入正则是为了进行模糊匹配
import re
# ret1 = re.findall('w\w{2}l','hello world')
# print(ret1)
# ret2 = re.findall('haijing','qwerewwwhaijing') #ret2 = re.findall('haijing','qwerewwwhaijing')中查到是否连续的haijing
# print(ret2) #有就打印haijing

#元字符 . ^ $ * + ? { } [ ]| ( ) \
#元字符(1) .
# import re
# ret3 = re.findall('w..l','hello world') #匹配wxxl xx可以为任意字母 即一个元字符 . 代表任意一个字符
# print(ret3)
# ret4 = re.findall('w.l','hello w\nld')
# print(ret4) #打印为空,说明元字符点不能代表换行符\n,其余的均可以

#元字符(2) 通配符 ^
# import re
# ret5 = re.findall('^h...o','hjasdflhello')
# print(ret5) #加一个通配符^的作用是在遇到第一个h就开始匹配,以后再遇到h不再进行匹配

#元字符(3) 结束符 $
# import re
# ret6 = re.findall('h...o$','qwerrwhello') #从后面开始匹配,可以看到在qwerrwhello的最后有hello,所以可以匹配上
# print(ret6)
# ret7 = re.findall('h...o$','qwerrwhellpl') #则匹配不上

#元字符(4) 重复匹配 * 重复前面字符的个数,个数包括0个
# import re
# re.findall('a.*x','fjkllalexkklll') #a.*x 表示重复点.多次
# re.findall('a*','aaaabaaaaaaa') #不管有多少个a,都可以匹配上

#元字符(5) + 表示重复 ab+ 是至少要有一个b,如果有0个b则匹配不上
re.findall('ab+','abbbbbkkll') #匹配出abbbbb

#元字符(6) ?表示只能取0次或者1次
ret7 = re.findall('a?b','aaabhgklabkkkb')
print(ret7) #['ab', 'ab', 'b'] 有多个a只能匹配1个a,没有a也能匹配出来

#元字符(7) { } 贪婪匹配
#{1,}表示1到正无穷
# re.findall('a{3}b','jklaaab') #匹配出aaab
# re.findall('a{1,3}b','aaaab') #匹配1-3个a和一个b,如有多于三个的a,那就默认匹配最大的、3个a

#结论 :*等价于{0,+正无穷} +等价于{1,正无穷} ?等价于{0,1}

#元字符(8) 字符集 [ ] 或的关系
ret8 = re.findall('a[c,d]x','adx') #只能匹配出acx或者adx
print(ret8)
ret9 = re.findall('a[c,d,e]x','aexaaa') #只能匹配出acx或者adx或者aex
print(ret9)
ret10 = re.findall('[c-f]','acdfww') #匹配c到f之间的任意字符
print(ret10) #['c', 'd', 'f']
#字符集 [ ]的作用还有取消元字符的特殊功能
ret11 = re.findall('[w,*]','acdfwwdd*') #此时在[w,*]中的*没有任意字符的意思,只代表字符*
print(ret11) #['w', 'w', '*']
















猜你喜欢

转载自www.cnblogs.com/YiYA-blog/p/9751847.html