本节内容:
1、模块分类
2、time &datetime模块
3、random
4、os
5、sys
6、shutil
7、shelve
8、xml处理
9、hashlib
10、re正则表达式
----------------------------------------------------------------------------/---------------------------------------------------------------
1、模块分为三种:
•自定义模块
•内置标准模块(又称标准库)
•开源模块
import的本质:
导入一个模块本质上就是解释执行一个python文件
导入一个包本质上就是解释该包下的__init__.py文件
2、time &datetime模块
2.1 时间戳:
时间戳是指格林威治时间1970年01月01日00时00分00秒(北京时间1970年01月01日08时00分00秒)起至现在的总秒数。通俗的讲, 时间戳是一份能够表示一份数据在一个特定时间点已经存在的完整的可验证的数据。 它的提出主要是为用户提供一份电子证据, 以证明用户的某些数据的产生时间。 在实际应用上, 它可以使用在包括电子商务、 金融活动的各个方面, 尤其可以用来支撑公开密钥基础设施的 “不可否认” 服务。
UTC(Coordinated Universal Time,世界协调时)亦即格林威治天文时间,世界标准时间。在中国为UTC+8。DST(Daylight Saving Time)即夏令时。
2.2 时间的表示方式:
- 时间戳
- 格式化的时间字符串 如 2018-7-30 22:45:00
- 元组(共9个元素组成)
2.3 time常用方法
- time.time() #返回当前时间戳
- time.asctime() #返回时间格式“Mon Jul 30 22:58:03 2018”
- time.localtime( ) #返回当前本地时间的元组形式
- time.gmtime( ) #返回当前时间的零时区元组表达形式
- 时间字符串格式 转为 时间戳格式
- 时间戳格式 转为 时间字符串格式
1、time.time() #返回当前时间戳(返回的是UTC时区,如果要本地时间戳则 + 8h*60min*60s )
>>> time.time()
1532962138.999104
2、time.asctime( ) / time.ctime( ) #返回时间格式如“Mon Jul 30 22:58:03 2018”
>>> time.asctime()
'Mon Jul 30 23:15:30 2018'
>>> time.ctime()
'Mon Jul 30 23:15:07 2018'
3、time.localtime( ) #返回当前本地时间的元组形式
>>> time.localtime()
time.struct_time(tm_year=2018, tm_mon=7, tm_mday=30, tm_hour=23, tm_min=4, tm_sec=7, tm_wday=0, tm_yday=211, tm_isdst=0)
tm_wday : 本周第几天 tm_yday:今年第几天 tm_isdst:是否夏令时
4、time.gmtime( ) #返回当前时间的零时区元组表达形式
>>> time.gmtime( )
time.struct_time(tm_year=2018, tm_mon=7, tm_mday=30, tm_hour=15, tm_min=12, tm_sec=0, tm_wday=0, tm_yday=211, tm_isdst=0)
5、时间字符串格式 转为 时间戳格式
>>> A = time.strptime('2018/07/30','%Y/%m/%d') #把字符串格式转为元组表达形式
>>> A
time.struct_time(tm_year=2018, tm_mon=7, tm_mday=30, tm_hour=0, tm_min=0, tm_sec=0, tm_wday=0, tm_yday=211, tm_isdst=-1)
>>> time.mktime(A) #把元组表达形式转成时间戳
1532880000.0
6、时间戳格式 转为 时间字符串格式
>>> A = time.gmtime(time.time()+28800) #把UTC时间戳+28800转为本地时间戳,然后再转为元组表达形式
>>> A
time.struct_time(tm_year=2018, tm_mon=7, tm_mday=30, tm_hour=23, tm_min=38, tm_sec=17, tm_wday=0, tm_yday=211, tm_isdst=0)
>>> time.strftime('%Y-%m-%d %H:%M:%S',A) #把元组表达形式转为时间字符串形式
'2018-07-30 23:38:17'
格式参照:
%a 本地(locale)简化星期名称
%A 本地完整星期名称
%b 本地简化月份名称
%B 本地完整月份名称
%c 本地相应的日期和时间表示
%d 一个月中的第几天(01 - 31)
%H 一天中的第几个小时(24小时制,00 - 23)
%I 第几个小时(12小时制,01 - 12)
%j 一年中的第几天(001 - 366)
%m 月份(01 - 12)
%M 分钟数(00 - 59)
%p 本地am或者pm的相应符 一
%S 秒(01 - 61) 二
%U 一年中的星期数。(00 - 53星期天是一个星期的开始。)第一个星期天之前的所有天数都放在第0周。 三
%w 一个星期中的第几天(0 - 6,0是星期天) 三
%W 和%U基本相同,不同的是%W以星期一为一个星期的开始。
%x 本地相应日期
%X 本地相应时间
%y 去掉世纪的年份(00 - 99)
%Y 完整的年份
%Z 时区的名字(如果不存在为空字符)
%% ‘%’字符
2.4 datetime常用方法(主要用于时间加减)
print(datetime.datetime.now()) #返回2018-07-30 23:50:09.811569
print(datetime.date.fromtimestamp(time.time()) ) # 时间戳直接转成日期格式 2018-07-30
print(datetime.datetime.now() + datetime.timedelta(3)) #当前时间+3天
print(datetime.datetime.now() + datetime.timedelta(-3)) #当前时间-3天
print(datetime.datetime.now() + datetime.timedelta(hours=3)) #当前时间+3小时
print(datetime.datetime.now() + datetime.timedelta(minutes=30)) #当前时间+30分
3.random模块
此模块用于生成随机数,可限定生成随机数的范围,也可限定生成随机数的类型
- random.random() #返回一个 0-1之间的随机浮点数
- random.randint(n,m ) #返回一个指定范围内随机的整数,可取到n与m.
- random.randrange([star],stop[,sep]) #先调用range函数生成一个有规律的序列,然后从这个序列里面随机选出一个值
- random.choice( 一个序列) #随机地返回指定序列中的某个元素
- random.sample(一个序列,需要截取的长度) #随机地截取并返回指定序列的指定长度的元素,这个方法不会修改原序列
1、random.random() #返回一个 0-1之间的随机浮点数
>>> random.random()
0.769299750183857
2、random.randint(n,m ) #返回一个指定范围内随机的整数,可取到n与m
>>> random.randint(0,10)
10
3、random.randrange([star],stop[,sep]) #先调用range函数生成一个有规律的序列,然后从这个序列里面随机选出一个值
>>> random.randrange(1,10,2)
9
4、random.choice( 一个序列) #随机地返回指定序列中的某个元素
>>> random.choice([0,5,6,7,9,4,5,6,3])
6
5、random.sample(一个序列,需要截取的长度) #随机地截取并返回指定序列的指定长度的元素,这个方法不会修改原序列
>>> random.sample([1,2,3,4,5],3)
[2, 1, 3]
生成一个8位的包含大小写字母与数字的随机码
import random
def word():
'''
:return:一个8位的包含大小写字母与数字的随机码
'''
r_word = ''
for i in range(0,8):
chioce = random.randint(1,3)
if chioce == 1:
current = random.randint(0,9)
elif chioce == 2:
current = chr(random.randint(97,122))
else:
current = chr(random.randint(65,90))
r_word+= str(current)
return r_word
my_word = word()
print(my_word)
4、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 输出用于分割文件路径的字符串
os.name 输出字符串指示当前使用平台。win->'nt'; Linux->'posix'
os.system("bash command") 运行shell命令,直接显示
os.environ 获取系统环境变量
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所指向的文件或者目录的最后修改时间
5、sys模块
sys.path 返回模块的搜索路径,初始化时使用PYTHONPATH环境变量的值
6、shutil模块
高级的 文件、文件夹、压缩包 处理模块
即python中对zip等压缩文件的处理模块
7、shelve模块
shelve模块是一个简单的k,v将内存数据通过文件持久化的模块,可以持久化任何pickle可支持的python数据格式
7.1 序列化过程
import shelve
f = shelve.open('shelve_test')
class Test(object):
def __init__(self,n):
self.n = n
t = Test(123)
t2 = Test(1234564)
name = ['keep','rain','test']
f['test'] = name
f['t1'] = t
f['t2'] = t2
f.close( )
7.2 反序列化过程
import shelve
f = shelve.open('shelve_test')
print(f['test'])
print(f['t1'])
print(f['t2'])
8、XML处理
8.1XML格式
XML是一种文件格式,每个语言都支持,用于在各个不同的语言之间做数据传递用的中介文件,在没有Json之前都是用XML文件的
XML格式是一种标签类的语言,通过不同的 < >来识别,分层,可以简单理解为字典的嵌套,<>内的文字可当做字典的KEY,<>与</>之间的部分当做这个key的value
<?xml version="1.0"?>
<data>
<country name="Liechtenstein">
<rank updated="yes">2</rank>
<year>2008</year>
<gdppc>141100</gdppc>
<neighbor name="Austria" direction="E"/>
<neighbor name="Switzerland" direction="W"/>
</country>
<country name="Singapore">
<rank updated="yes">5</rank>
<year>2011</year>
<gdppc>59900</gdppc>
<neighbor name="Malaysia" direction="N"/>
</country>
<country name="Panama">
<rank updated="yes">69</rank>
<year>2011</year>
<gdppc>13600</gdppc>
<neighbor name="Costa Rica" direction="W"/>
<neighbor name="Colombia" direction="E"/>
</country>
</data>
8.2 python中处理XML的模块—— xml.etree.ElementTree
1、读取遍历XML文件
1、读取遍历XML文件
import xml.etree.ElementTree as ET
tree = ET.parse("xmltest.xml")
root = tree.getroot()
print(root.tag)
# 遍历xml文档
for child in root:
print(child.tag, child.attrib)
for i in child:
print(i.tag ,i.text)
# 只遍历year 节点
for node in root.iter('year'):
print(node.tag, node.text)
2、读取遍历XML文件
import xml.etree.ElementTree as ET
tree = ET.parse("xmltest.xml")
root = tree.getroot()
# 修改
for node in root.iter('year'):
new_year = int(node.text) + 1
node.text = str(new_year)
node.set("updated", "yes")
tree.write("xmltest.xml")
# 删除node
for country in root.findall('country'):
rank = int(country.find('rank').text)
if rank > 50:
root.remove(country)
tree.write('output.xml')
3、自己创建XML文件
import xml.etree.ElementTree as ET
new_xml = ET.Element("namelist")
name = ET.SubElement(new_xml, "name", attrib={"enrolled": "yes"})
age = ET.SubElement(name, "age", attrib={"checked": "no"})
sex = ET.SubElement(name, "sex")
sex.text = '33'
name2 = ET.SubElement(new_xml, "name", attrib={"enrolled": "no"})
age = ET.SubElement(name2, "age")
age.text = '19'
et = ET.ElementTree(new_xml) # 生成文档对象
et.write("newXMLtest.xml", encoding="utf-8", xml_declaration=True)
9、hashlib
用于加密相关的操作,3.x里代替了md5模块和sha模块,主要提供 SHA1, SHA224, SHA256, SHA384, SHA512 ,MD5 算法
import hashlib
m = hashlib.md5()
m.update("Hello".encode())
print(m.hexdigest()) #此处打印出来的会是'Hello'的MD5值(十六进制)
m.update("It's me".encode())
print(m.hexdigest()) #此处打印出来的会是‘HelloIt's me'的MD5值(十六进制),而不是‘It's me'的
import hashlib
m = hashlib.md5()
m.update("Hello".encode())
print(m.hexdigest()) #此处打印出来的会是'Hello'的MD5值(十六进制)
m.update("It's me".encode())
print(m.hexdigest()) #此处打印出来的会是‘HelloIt's me'的MD5值(十六进制),而不是‘It's me'的
import hashlib
# ######## md5 ########
hash = hashlib.md5()
hash.update('admin')
print(hash.hexdigest())
# ######## sha1 ########
hash = hashlib.sha1()
hash.update('admin')
print(hash.hexdigest())
# ######## sha256 ########
hash = hashlib.sha256()
hash.update('admin')
print(hash.hexdigest())
# ######## sha384 ########
hash = hashlib.sha384()
hash.update('admin')
print(hash.hexdigest())
# ######## sha512 ########
hash = hashlib.sha512()
hash.update('admin')
print(hash.hexdigest())
10.re正则表达式模块
10.1 通配符
. 称为通配符,可以匹配任何字符(除了换行字符)
例如 正则表达式‘.ython’可以匹配字符串‘python’、‘jython‘、‘ ython’、‘+ython’等
但是不会匹配‘cpython’或者‘ython’这样的字符串,因为点号只匹配一个字母,而不是零个或者两个。
10.2 对特殊字符进行转义
‘python\\.org’,用\\对.号进行转义,这样子就只会匹配 ‘python.org’
10.3 字符集
- ‘[pj]ython’这样子只能匹配‘python’和‘jython’
- ‘[a-z]’这样子就能够(按照字母顺序)匹配a到z的任意一个字符
- ‘[a-zA-Z0-9]’这样子就可以匹配a-z、A-Z、0-9的所有字符,即任意大小写字母和数字(注意字符集只可以匹配一个这样的字符)
- ‘[^abc]’这样子就可以匹配除了a、b、c之外的所有字符,^称为反转字符
10.4 选择符和子模式
- ‘python|perl’ 这样子只会匹配 python或者perl字符串
- ‘p(ython|erl)’效果如上,匹配 python或者perl字符串
10.5 可选项和重复子模式
在子模式后面加上问号,它就变成了可选项。
例如 r‘(http://)?(www\.)?python\.org’
只能匹配以下字符串:
‘http://www.python\.org’
‘http://python\.org’
‘python\.org’
每个可选子模式都应该用圆括号括起来;每个子模式出现与否均可,且互相独立。
问号表示子模式可以出现或者根本不出现。下面的运算符允许子模式重复多次:
- r‘w*\.python\.org’ 会匹配 ‘www.python.org’,‘.python.org’、‘ww.python.org’、‘wwwww.python.org’等,*表示子模式可以重复0次或者多次
- r‘w+\.python\.org’会匹配‘w.python.org’,但不会匹配‘.python.org’,即+表示子模式可以重复1次或者多次
- r‘w{3,5}\.python\.org’则只会匹配 ‘www.python.org ’、‘wwww.python.org ’、‘wwwww.python.org ’
'.' 默认匹配除\n之外的任意一个字符,若指定flag DOTALL,则匹配任意字符,包括换行
'^' 匹配字符开头,若指定flags MULTILINE,这种也可以匹配上(r"^a","\nabc\neee",flags=re.MULTILINE)
'$' 匹配字符结尾,或e.search("foo$","bfoo\nsdfsf",flags=re.MULTILINE).group()也可以
'*' 匹配*号前的字符0次或多次,re.findall("ab*","cabb3abcbbac") 结果为['abb', 'ab', 'a']
'+' 匹配前一个字符1次或多次,re.findall("ab+","ab+cd+abb+bba") 结果['ab', 'abb']
'?' 匹配前一个字符1次或0次
'{m}' 匹配前一个字符m次
'{n,m}' 匹配前一个字符n到m次,re.findall("ab{1,3}","abb abc abbcbbb") 结果'abb', 'ab', 'abb']
'|' 匹配|左或|右的字符,re.search("abc|ABC","ABCBabcCD").group() 结果'ABC'
'(...)' 分组匹配,re.search("(abc){2}a(123|456)c", "abcabca456c").group() 结果 abcabca456c
'\A' 只从字符开头匹配,re.search("\Aabc","alexabc") 是匹配不到的
'\Z' 匹配字符结尾,同$
'\d' 匹配数字0-9
'\D' 匹配非数字
'\w' 匹配[A-Za-z0-9]
'\W' 匹配非[A-Za-z0-9]
's' 匹配空白字符、\t、\n、\r , re.search("\s+","ab\tc1\n3").group() 结果 '\t'
'(?P<name>...)' 分组匹配 re.search("(?P<province>[0-9]{4})(?P<city>[0-9]{2})(?P<birthday>[0-9]{4})","371481199306143242").groupdict("city") 结果{'province'
最常用的匹配语法
- re.match 从头开始匹配
- re.search 匹配包含
- re.findall 把所有匹配到的字符放到以列表中的元素返回
- re.splitall 以匹配到的字符当做列表分隔符
- re.sub 匹配字符并替换