迭代器
满足迭代器协议:
1、内部有next方法
2、内部有iter()方法
os模块
import os print(os.getcwd()) #C:UsersLowryPycharmProjectsfullstack_s2week4day5 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 匹配任何空白字符;它相当于类[ f v ]
S 匹配任何非空白字符;它相当于类[ ^ f v ]
w 匹配任何字母数字字符;它相当于类[a-zA-Z0-9]
W 匹配任何非字母数字字符;它相当于类[^a-zA-Z0-9]
匹配一个字母或数字与特殊字符之间的边界,特殊字符包括:¥#,等
ret = re.findall('\\','abcde') print(ret) #['\'] #出现这个现象的原因是,在python中也是转义的意思,\\要经过python解释器解释成\,然后将\传给re解释器。 m = re.search(r'blow','blow') print(m) #<_sre.SRE_Match object; span=(0, 4), match='blow'> #在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')) #123 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']