基础的东西多看看3
11.13
正则表达式:
正则表达式 是一种处理文件的规则,让我们从杂乱无章的文字中提取有效信息
字符组:表示再一个字符的位置可以出现的所有情况的集合就是一个字符组
表示数字的字符组:
[13456782]
[0123456789]
[0-9]
[2-8]
简写模式必须由小到大
表示字母的字符组
[abcd]
[a-z]
[A-Z]
表示匹配任意字符 : [\w\W][\d\D][\S\s]





re模块:
import re
ret = re.findall('a', 'eva egon yuan') # 返回所有满足匹配条件的结果,放在列表里
print(ret) #结果 : ['a', 'a']
ret = re.search('a', 'eva egon yuan').group()
print(ret) #结果 : 'a'
# 函数会在字符串内查找模式匹配,只到找到第一个匹配然后返回一个包含匹配信息的对象,该对象可以
# 通过调用group()方法得到匹配的字符串,如果字符串没有匹配,则返回None。
ret = re.match('a', 'abc').group() # 同search,不过尽在字符串开始处进行匹配
print(ret)
#结果 : 'a'
ret = re.split('[ab]', 'abcd') # 先按'a'分割得到''和'bcd',在对''和'bcd'分别按'b'分割
print(ret) # ['', '', 'cd']
ret = re.sub('\d', 'H', 'eva3egon4yuan4', 1)#将数字替换成'H',参数1表示只替换1个
print(ret) #evaHegon4yuan4
ret = re.subn('\d', 'H', 'eva3egon4yuan4')#将数字替换成'H',返回元组(替换的结果,替换了多少次)
print(ret)
obj = re.compile('\d{3}') #将正则表达式编译成为一个 正则表达式对象,规则要匹配的是3个数字
ret = obj.search('abc123eeee') #正则表达式对象调用search,参数为待匹配的字符串
print(ret.group()) #结果 : 123
import re
ret = re.finditer('\d', 'ds3sy4784a') #finditer返回一个存放匹配结果的迭代器
print(ret) # <callable_iterator object at 0x10195f940>
print(next(ret).group()) #查看第一个结果
print(next(ret).group()) #查看第二个结果
print([i.group() for i in ret]) #查看剩余的左右结果
collectiopons模块:
from collections import namedtuple
P = namedtuple("Point", ["x", "y"])
p1 = P([1, 2, 3, 4, 5], ["a", "b", "c"])
p2 = P("生日", "1999-1-1")
print(p1.x) # [1, 2, 3, 4, 5]
print(p1.y) # ['a', 'b', 'c']
print(p2.x) # 生日
print(p2.y) # 1999-1-1
# 描述一类东西的时候,这一类东西都有相同的特征。
# 想直接用特征的名字就描述这个值的时候,就可以用可命名元祖
import queue # 队列
q = queue.Queue() # 先进先出原则
q.put("a") # 往队列里面 添加值
q.put("b")
q.put("c")
q.put("d")
q.put("e")
print(q.qsize()) # 5 查看队列的值
print(q.get()) # a 取值,只能按照添加顺序来取
print(q.qsize()) # 4
print(q.get()) # b
print(q.qsize()) # 3
from collections import deque # 双端队列,可以快速的从左右的某一侧追加和推出对象
dq = deque()
dq.append('a')
dq.append('b')
dq.appendleft('c')
dq.append("d")
dq.appendleft('e')
print(dq) # deque(['e', 'c', 'a', 'b', 'd'])
print(dq.popleft()) # 从左侧拿出
print(dq.pop()) # 从右侧拿出
for i in dq:
print(i) # 从左至右一次输出
from collections import OrderedDict # 有序字典
od = OrderedDict([('a', [1, 2, 3, 4]), ('b', 2), ('c', 3)]) # OrderedDict的Key是有序的
for k in od:
print(k, od[k])
# OrderedDict的Key会按照插入的顺序排列,不是Key本身排序:
time模块:
%y 两位数的年份表示(00-99) %Y 四位数的年份表示(000-9999) %m 月份(01-12) %d 月内中的一天(0-31) %H 24小时制小时数(0-23) %I 12小时制小时数(01-12) %M 分钟数(00=59) %S 秒(00-59) %a 本地简化星期名称 %A 本地完整星期名称 %b 本地简化的月份名称 %B 本地完整的月份名称 %c 本地相应的日期表示和时间表示 %j 年内的一天(001-366) %p 本地A.M.或P.M.的等价符 %U 一年中的星期数(00-53)星期天为星期的开始 %w 星期(0-6),星期天为星期的开始 %W 一年中的星期数(00-53)星期一为星期的开始 %x 本地相应的日期表示 %X 本地相应的时间表示 %Z 当前时区的名称 %% %号本身

import time
# print(time.time()) # 1510649109.4850657 时间戳:记录了从1970.1.1到现在的所有秒
# print(time.strftime("%Y-%m-%d %H:%M:%S")) # 2017-11-14 16:45:09
# print(time.strftime("%x %X")) # 11/14/17 16:45:09
# print(time.localtime()) # 当前时区的格式化时间字符串
# print(time.localtime(time.time())) # 将时间戳 转化为当前时区的格式化时间字符串
# print(time.gmtime()) # 伦敦时间,比北京时间晚8个小时

sys模块:
# sys.argv 命令行参数List,第一个元素是程序本身路径 # sys.exit(n) 退出程序,正常退出时exit(0),错误退出sys.exit(1) # sys.version 获取Python解释程序的版本信息 # sys.path 返回模块的搜索路径,初始化时使用PYTHONPATH环境变量的值 # sys.platform 返回操作系统平台名称
import sys try: sys.exit(1) except SystemExit as e: print(e)
os模块:
os.getcwd() 获取当前工作目录,即当前python脚本工作的目录路径
os.chdir("dirname") 改变当前脚本工作目录;相当于shell下cd
os.curdir 返回当前目录: ('.')
os.pardir 获取当前目录的父目录字符串名:('..')
os.makedirs('dirname1/dirname2') 可生成多层递归目录
os.removedirs('dirname1') 若目录为空,则删除,并递归到上一级目录,如若也为空,则删除,依此类推
os.mkdir('dirname') 生成单级目录;相当于shell中mkdir dirname
os.rmdir('dirname') 删除单级空目录,若目录不为空则无法删除,报错;相当于shell中rmdir dirname
os.listdir('dirname') 列出指定目录下的所有文件和子目录,包括隐藏文件,并以列表方式打印
os.remove() 删除一个文件
os.rename("oldname","newname") 重命名文件/目录
os.stat('path/filename') 获取文件/目录信息
os.sep 输出操作系统特定的路径分隔符,win下为"\\",Linux下为"/"
os.linesep 输出当前平台使用的行终止符,win下为"\t\n",Linux下为"\n"
os.pathsep 输出用于分割文件路径的字符串 win下为;,Linux下为:
os.name 输出字符串指示当前使用平台。win->'nt'; Linux->'posix'
os.system("bash command") 运行shell命令,直接显示
os.popen("bash command) 运行shell命令,获取执行结果
os.environ 获取系统环境变量
os.path
os.path.abspath(path) 返回path规范化的绝对路径
os.path.split(path) 将path分割成目录和文件名二元组返回
os.path.dirname(path) 返回path的目录。其实就是os.path.split(path)的第一个元素
os.path.basename(path) 返回path最后的文件名。如何path以/或\结尾,那么就会返回空值。
即os.path.split(path)的第二个元素
os.path.exists(path) 如果path存在,返回True;如果path不存在,返回False
os.path.isabs(path) 如果path是绝对路径,返回True
os.path.isfile(path) 如果path是一个存在的文件,返回True。否则返回False
os.path.isdir(path) 如果path是一个存在的目录,则返回True。否则返回False
os.path.join(path1[, path2[, ...]]) 将多个路径组合后返回,第一个绝对路径之前的参数将被忽略
os.path.getatime(path) 返回path所指向的文件或者目录的最后访问时间
os.path.getmtime(path) 返回path所指向的文件或者目录的最后修改时间
os.path.getsize(path) 返回path的大小
random模块:
import random
print(random.random()) # 0-1之间的小数
print(random.uniform(10, 12)) # n,m 之间的小数
# 生成随机整数
print(random.randint(1, 2)) # 必须是两个参数,规定一个范围 [1,2]
print(random.randrange(100)) # 一个参数
print(random.randrange(1, 2)) # 两个个参数 [1,2)
print(random.randrange(90, 100, 2)) # 三个参数,最后一个是步长
# 从一个序列中随机选择:一个 choice,多个 sample
print(random.choice('abc'))
print(random.sample([1, '23', [4, 5]], 2))
# 打乱一个序列的顺序
item = [1, 3, 5, 7, 9]
random.shuffle(item) # 改变了原列表
print(item)
6位数字验证码:
l = []
for i in range(6):
rand_num = random.randint(0,9)
l.append(str(rand_num))
print(''.join(l))
6位数字加大小写字母验证码:
l = []
for i in range(6):
alpha = chr(random.randint(65, 90))
alpha_lower = chr(random.randint(97, 122))
num = str(random.randint(0, 9))
ret = random.choice([alpha, num, alpha_lower])
l.append(ret)
print(''.join(l))
序列化模块:
什么叫序列化——将原本的字典、列表等内容转换成一个字符串的过程就叫做序列化。
比如,我们在python代码中计算的一个数据需要给另外一段程序使用,那我们怎么给? 现在我们能想到的方法就是存在文件里,然后另一个python程序再从文件里读出来。 但是我们都知道,对于文件来说是没有字典这个概念的,所以我们只能将数据转换成字典放到文件中。 你一定会问,将字典转换成一个字符串很简单,就是str(dic)就可以办到了,为什么我们还要学习序列化模块呢? 没错序列化的过程就是从dic 变成str(dic)的过程。现在你可以通过str(dic),将一个名为dic的字典转换成一个字符串, 但是你要怎么把一个字符串转换成字典呢? 聪明的你肯定想到了eval(),如果我们将一个字符串类型的字典str_dic传给eval,就会得到一个返回的字典类型了。 eval()函数十分强大,但是eval是做什么的?e官方demo解释为:将字符串str当成有效的表达式来求值并返回计算结果。 BUT!强大的函数有代价。安全性是其最大的缺点。 想象一下,如果我们从文件中读出的不是一个数据结构,而是一句"删除文件"类似的破坏性语句,那么后果实在不堪设设想。 而使用eval就要担这个风险。 所以,我们并不推荐用eval方法来进行反序列化操作(将str转换成python中的数据结构)
序列化的目的
1、以某种存储形式使自定义对象持久化;
2、将对象从一个地方传递到另一个地方。
3、使程序更具维护性。

json模块提供了四个功能:dumps、dump、loads、load
import json dic = {'k1':'v1','k2':'v2','k3':'v3'} str_dic = json.dumps(dic) #序列化:将一个字典转换成一个字符串 print(type(str_dic),str_dic) #<class 'str'> {"k3": "v3", "k1": "v1", "k2": "v2"} #注意,json转换完的字符串类型的字典中的字符串是由""表示的 dic2 = json.loads(str_dic) #反序列化:将一个字符串格式的字典转换成一个字典 #注意,要用json的loads功能处理的字符串类型的字典中的字符串必须由""表示 print(type(dic2),dic2) #<class 'dict'> {'k1': 'v1', 'k2': 'v2', 'k3': 'v3'} list_dic = [1,['a','b','c'],3,{'k1':'v1','k2':'v2'}] str_dic = json.dumps(list_dic) #也可以处理嵌套的数据类型 print(type(str_dic),str_dic) #<class 'str'> [1, ["a", "b", "c"], 3, {"k1": "v1", "k2": "v2"}] list_dic2 = json.loads(str_dic) print(type(list_dic2),list_dic2) #<class 'list'> [1, ['a', 'b', 'c'], 3, {'k1': 'v1', 'k2': 'v2'}]
import json f = open('json_file','w') dic = {'k1':'v1','k2':'v2','k3':'v3'} json.dump(dic,f) #dump方法接收一个文件句柄,直接将字典转换成json字符串写入文件 f.close() f = open('json_file') dic2 = json.load(f) #load方法接收一个文件句柄,直接将文件中的json字符串转换成数据结构返回 f.close() print(type(dic2),dic2)
json :所有语言通用,能转换的数据类型有限 *****
pickle :只限于python,能转换所有的数据类型 做游戏的时候
shelve : 只限于python语言,能转换所有的数据类型,使用方法类似字典
异常处理:
def func():
try: # 处理异常
print("try")
except Exception as e: # 出现异常进入,e 会抛出异常类型
print("except:%s" % e)
return
else: # 执行完try 会执行else
print("else")
finally: # finally 会始终执行,即便进入except 抛出错误 return也阻止不了
print('finally') # 适用于关闭数据库,文件等
func()

浙公网安备 33010602011771号