基础的东西多看看3

11.13

正则表达式:

http://tool.chinaz.com/regex/

正则表达式 是一种处理文件的规则,让我们从杂乱无章的文字中提取有效信息

字符组:表示再一个字符的位置可以出现的所有情况的集合就是一个字符组

 

表示数字的字符组:
[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)
异常处理和status

 

 

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'}]
dumps 和 loads
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)
dump 和 load
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()

 

  

 

 

posted @ 2017-11-13 15:41  丶迷城  阅读(79)  评论(0)    收藏  举报