Python:Day18 os模块、logging模块、正则表达式

2023-03-07,,

迭代器

  满足迭代器协议:

    1、内部有next方法

    2、内部有iter()方法

os模块

import os
print(os.getcwd()) #C:\Users\Lowry\PycharmProjects\fullstack_s2\week4\day5
os.chdir('..') #改变当前脚本工作目录,可以写绝对路径,也可以用..表示当前目录的上级目录
print(os.curdir) #返回当前目录: ('.')
print(os.pardir) # 获取当前目录的父目录字符串名:('..')
os.makedirs('abc/ccc/ddd') #生成多级目录
os.removedirs('abc/ccc') #若目录为空,则删除目录并递规到上级目录,如果不为空,则不删除,如果最底层不为空,则报错
os.mkdir('abc/eee') #创建单个目录
os.rmdir('abc/eee') #删除单个目录,如果为空则删除,如果不为空则报错
os.remove("abc/ccc/aaa") #删除一个文件,只能是文件,目录不行,另外路径要对
print(os.listdir('c:\intel')) #括号内填写路径,如果不填写默认为当前路径,路径不区分大小写
os.rename('abc','bcd') #重使命名一个文件或目录,前提是要用cddir命令将路径切换到文件所在的目录
print(os.stat('./bcd')) #os.stat_result(st_mode=16895, st_ino=84442493013270541, st_dev=3026778051, st_nlink=1, st_uid=0, st_gid=0, st_size=0, st_atime=1518310074, st_mtime=1518310074, st_ctime=1518310002)
print(os.sep) #输出操作系统特定的路径分隔符
print(os.linesep) #输出当前操作系统使用的行终止符
print(os.pathsep) #输出用于分割文件路径的分隔符
os.system('arp -a') #在CMD中执行命令

hashlib模块

import hashlib
m = hashlib.md5()
m.update(b"alex")
print(m.hexdigest()) #534b44a19bf18d20b71ecc4eb77c572f m1 = hashlib.sha256()
m1.update("alex".encode("utf8"))
print(m1.hexdigest()) #4135aa9dc1b842a653dea846903ddb95bfb8c5a10c504a7fa16e10bc31d1fdf0

logging模块

import logging

logging.basicConfig(level=logging.DEBUG,    #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') #此项可写也可不写,不写默认为a,也就是追加模式 logging.debug('this is debug message')
logging.info('this is info message')
logging.warning('this is warning message')
logging.error('this is error message')
logging.critical('this is critical message')
'''
Mon, 26 Feb 2018 09:02:54 logging模块.py[line:14 DEBUG this is debug message
Mon, 26 Feb 2018 09:02:54 logging模块.py[line:15 INFO this is info message
Mon, 26 Feb 2018 09:02:54 logging模块.py[line:16 WARNING this is warning message
Mon, 26 Feb 2018 09:02:54 logging模块.py[line:17 ERROR this is error message
Mon, 26 Feb 2018 09:02:54 logging模块.py[line:18 CRITICAL this is critical message
'''

在logging.basicConfig()函数中可通过具体参数来更改logging模块默认行为,可用参数有

level:设置rootlogger(后边会讲解具体概念)的日志级别

format:指定handler使用的日志显示格式。

datefmt:指定日期时间格式。

filename:用指定的文件名创建FiledHandler(后边会具体讲解handler的概念),这样日志会被存储在指定的文件中。

filemode:文件打开方式,在指定了filename时使用这个参数,默认值为“a”还可指定为“w”。

format参数中可能用到的格式化串:

%(name)s Logger的名字

%(levelno)s 数字形式的日志级别

%(levelname)s 文本形式的日志级别

%(pathname)s 调用日志输出函数的模块的完整路径名,可能没有

%(filename)s 调用日志输出函数的模块的文件名

%(module)s 调用日志输出函数的模块名

%(funcName)s 调用日志输出函数的函数名

%(lineno)d 调用日志输出函数的语句所在的代码行

%(created)f 当前时间,用UNIX标准的表示时间的浮 点数表示

%(relativeCreated)d 输出日志信息时的,自Logger创建以 来的毫秒数

%(asctime)s 字符串形式的当前时间。默认格式是 “2003-07-08 16:49:45,896”。逗号后面的是毫秒

%(thread)d 线程ID。可能没有

%(threadName)s 线程名。可能没有

%(process)d 进程ID。可能没有

%(message)s用户输出的消息

configparser模块

#这个模块是用来做创建和修改配置文件用的
import configparser
conf = configparser.ConfigParser() #后面这个括号别忘记加了 #对于section的操作(没有改这个操作)
conf.add_section("section1")
conf.remove_section("section1")
conf.sections() #对于option的操作(改只能通过字典的形式操作)
conf.set("section1","option1","value") #这个是新增一个,如果里面以前有,程序还会创建另外一个一模一样的
conf.remove_option("secion1","option1")
conf.options("section1")
conf.get("section1","option1")

re模块

正则表达式

就基本本质而言,正则表达式是一种小型的、高度专业化的编程语言,(在python中)它内嵌在python中,并通过re模块实现

1、正则表达式是用来干嘛的?

答:是用来匹配 字符串的 (就是说正则和字典、列表、元组没半毛钱关系)

string提供的方法是完全匹配

引入正则:模糊匹配

元字符

. 通配符

^ 以...开头

$ 以...结尾

* 重复前面字符任意次(0~无穷次)

+ 匹配前面的字符1~无穷次

? 匹配前面这符(0~1次)

{m,n} 匹配前面的字符至少m次,至多n次,也可以写成{m}代表匹配m次,也可以写成{m,}代表匹配匹配前面字符m次到无穷次

字符集

[ ]:匹配指定范围内的任意单个字符,另外一个作用是取消元字符的特殊功能(除了三个字符:\  ^  - )

[1,2,a,5,p]、[a-z]、[1-9]

[^] 表示取反,[^4,5] 表示非4和非5的所有字符

ret = re.findall('a[24,38, ,yt,bo]','a24lokreabbsa eoiwa38a4')
print(ret) #['a2', 'ab', 'a ', 'a3', 'a4']
#从结果可以看出,只能匹配字符集中的一个,哪怕中间没有逗号隔开,也只能匹配其中一个,好像有没有逗号结果一样。 ret = re.findall('a[2438 ytbo]','a24lokreabbsa eoiwa38a4')
print(ret) #['a2', 'ab', 'a ', 'a3', 'a4']
#结果证明有没有逗号结果都是一样的,那要逗号有什么用?逗号在这里面也是一个普通字符,用于匹配后面的字符串。
#另外建议如果不匹配逗号的话,不要加逗号,所有字符写在一起。

\ :反斜杠

反斜杠后边跟元字符去除特殊功能

反斜杠后边跟普通字符实现特殊功能

\d  匹配任何十进制数;它相当于类[0-9]

\D 匹配任何非数字字符;它相当于类[^0-9]

\s  匹配任何空白字符;它相当于类[ \t \n \r \f \v ]

\S  匹配任何非空白字符;它相当于类[ ^\t \n \r \f \v ]

\w  匹配任何字母数字字符;它相当于类[a-zA-Z0-9]

\W  匹配任何非字母数字字符;它相当于类[^a-zA-Z0-9]

\b  匹配一个字母或数字与特殊字符之间的边界,特殊字符包括:¥#,等

ret = re.findall('\\\\','abc\de')
print(ret) #['\\']
#出现这个现象的原因是,\在python中也是转义的意思,\\\\要经过python解释器解释成\\,然后将\\传给re解释器。 m = re.search(r'\bblow','blow')
print(m) #<_sre.SRE_Match object; span=(0, 4), match='blow'>
#\b在python中也有特殊意思,所以前面不加r的时候匹配不到结果,在前面加个r就可以了,r的就是告诉python解释器,里面的是原生字符,不是元字符

findall返回的是一个列表

search返回的是一个对象,匹配出第一个满足条件的结果

ret.group()  取出匹配的值

ret = re.search('ab','sfabsdiowfabjkab')
print(ret) #<_sre.SRE_Match object; span=(2, 4), match='ab'>
ret.group()  #取匹配的值
print(ret.group()) #ab

( )

print(re.search('(as)+','adjkfasas').group())   #asas 贪婪匹配
print(re.search('(as)|3','3as').group()) # |表示或
ret = re.search('(?P<id>\d{3})/(?P<name>\w{3})','weeew34ttt123/ooo')
#?P为固定格式,没有具体意义,尖括号中字符是名称<名称>,用来给分组中匹配到的字符取名字,方便调取
print(ret.group()) #123/ooo
print(ret.group('id')) #
print(ret.group('name')) #ooo

正则表达式的方法:

1、findall( ) :所有结果都返回到一个列表里

2、search( ):返回匹配到的第一个对象,对象可以调用group()返回结果

3、match( ):只在字符串开始匹配,返回匹配到的第一个对象,对象可以调用group()返回结果

4、split( ):将字符串分隔开,和字符串的split一样的,但功能更强大

ret = re.split('[j,s]','sdjksal')   #先用第一个字符分,然后再用后面一个分
print(ret) #['', 'd', 'k', 'al'] 思考空是哪来的?

5、sub( ):替换,和字符串中的replace功能一样,但功能更强大

ret = re.sub('a..x','s..b','hfjasalexxdhf')  #前一个参数是规则,后一个为远的的内容,没有元字符的意义
print(ret) #hfjass..bxdhf
x='ab'
y='xxxx'
z = 'weabcdeidos'
print(re.sub(x,y,z)) #替换后生成一个新的值,替换的对象不做变更
print(z) #虽然做了替换,但Z并没有改变,字符串做替换也是一样,本原不变

6、compile( ):编译

obj = re.compile('\.com')   #编译一个规则并赋值给一个变量
ret = obj.findall('fhasjd.comhfajld') #用变量调用方法,后面直接加字符串
print(ret) #['.com']

Python:Day18 os模块、logging模块、正则表达式的相关教程结束。

《Python:Day18 os模块、logging模块、正则表达式.doc》

下载本文的Word格式文档,以方便收藏与打印。