本节大纲:
1、模块讲解
2、hashlib and hmac
3、random
4、shelve
5、shutil
6、time and datetime
7、os and sys
8、re
9、xml
10、ConfigParser
1、模块讲解
定义:用一砣代码实现了某个功能的代码集合
导入方式:
import module_text
from module import module_text from module import module_text as MT from . import module_textimport本质:
导入模块的本质就是把python文件解释一遍
导入包的本质就是去执行/解释包下的__init__.py文件
2、hashlib and hmac(文件加密)
hashlib主要提供SHA1, SHA224, SHA256, SHA384, SHA512 ,MD5 算法,越大保密性越强,但是效率越低
hmac 提供key-value的加密方法
####加密方式不是一行一行加密,而是一起加密
--------------------------------------------
import hashlib
m = hashlib.md5()m.update(b'hello')print(m.hexdigest())m.update(b'world')等于:m.update(b'helloworld')print(m.hexdigest())m2 = hashlib.sha256
m.update('如果这都不算爱'.encode('utf-8')) #如果需要加密中文,需要encode()2) hmac
import hmac
h = hmac.new(b'hello')h.update(b'world')print(h.hexdigest())等于:h = hmac.new(b'hello',b'world')print(h.hexdigest())
3、random(随机数)
random.random() # 随机出现从0到1之前的数字
random.randrange(x,y) # 随机出现从x到y不包括y之间的整数random.uniform(x,y) # 随机出现x到y之间的浮点数random.randint(x,y) # 随机出现x到y之间的整数包括xyrandom.choice() #从序列中随机出现里面的值 random.sample(‘序列’,‘count’) # 随机出现序列中count个数的值random.shuffle() # 打乱序列的数值----------------------验证码程序------------------
def check_mk(n):
check_code = '' for i in range(n): current = random.randrange(n) if i == current: tmp = random.randint(0,9) else: tmp = chr(random.randint(65,90)) check_code += str(tmp) return check_code
4、shelve
shelve模块是一个简单的k,v将内存数据通过文件持久化的模块,可以持久化任何pickle可支持的python数据格式
---------------------shelve模块-----------------------
list = [1,2,3,4] name = 'lili' age = '22' h = shelve.open('shelve_test1') h['name'] = name h['list'] = list h['age'] = age h.close() c = shelve.open('shelve_test1') print(c['name'])
5、shutil
高级的 文件、文件夹、压缩包 处理模块
shutil.copyfileobj(f1,f2) #复制文件,需要先open文件
shutil.copyfile(src, dst) # 复制文件,不需要打开文件shutil.copymode(src, dst) #复制权限shutil.copy(src, dst) #复制文件和权限shutil.copy2(src, dst) #复制文件和状态shutil.copytree(path,path1) # 递归复制目录shutil.rmtree(path,path1) # 递归删除目录shutil.make_achieve() # 文件压缩
6、time and datetime
时间模块:time,datetime 1、time 时间获取方式:1、时间戳(timestamp) 2、元组(struct_time) 3、格式化字符串(format string) 2、datetime (1)、时间加减
time:
time.gmtime() # 返回以元组形式的UTC时间
time.localtime() # 返回以元组形式的当时时间time.time() # 返回当时时间的时间戳time.mktime() # 将元组形式的time.strftime() # 将元组转换成格式化字符串time.strptime() #将格式化字符串转换成元组time.asctime() # 将元组转换成固定格式的字符串time.ctime() #将时间戳转换成固定格式的字符串- %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 当前时区的名称
- %% %号本身
datetime:时间加减
print(datetime.datetime.now()) #以字符串方式打印当前时间
print(datetime.datetime.now() + datetime.timedelta(3)) #打印三天后的时间print(datetime.datetime.now() + datetime.timedelta(hours = -3)) # 打印三小时前的时间print(datetime.datetime.now() + datetime.timedelta(minutes = 30)) # 打印30分钟后的时间
7、os and sys
os:
os.getcwd() # 获取当前目录路径
os.chdir() # 改变当前路径print(os.curdir) # 相对路径 ‘.’print(os.pardir) # 相对上级路径 ‘..’os.makedirs(路径)#递归创建目录os.removedirs(路径)#递归删除空目录os.mkdir(路径) # 创建目录,如果上一级不存在,则报错os.rmdir(路径) # 删除空文件os.listdir(路径) # 显示当前目录下的内容os.stat(路径) # 获取目录\文件信息os.sep # 输出当前系统的路径分隔符os.linesep # 输出当前系统的换行符os.pathsep # 输出当前系统的不同路径的分隔符os.environ # 输出当前的环境变量os.path.split() # 分割目录路径与文件os.path.bathname() # 输出路径最底层名字os.path.exists() # 判断路径是否存在os.path.isabs() # 判断是否为绝对路径os.path.isfile() # 判断是否为文件os.path.isdir() # 判断是否为目录os.path.join(path1,path2.....) # 将多个路径组合返回,第一个绝对路径之前的参数将被忽略,路径可不存在os.path.getatime() # 返回文件或目录存取时间os.path.getmtime() # 返回文件或目录修改时间os.path.getctime() # 返回文件或目录创建时间
8、re正则表达式
re.match 从头开始匹配 ^括号在match里面没用 re.search 匹配包含,从左往右,用.group返回结果 re.findall 把所有匹配到的所有字符放到以列表中的元素返回 re.splitall 把匹配到的字符当做列表分隔符 re.sub 匹配字符并替换 匹配结束后可以加匹配模式 re.I re.M re.S '.' 表示匹配任意一个字符 '+' 匹配一个或多个字符 '$' 匹配字符结尾 '^' 匹配字符开头 '?' 匹配前一个字符0次或一次 '{m}' 匹配前一个字符m次 '{n,m}' 匹配前一个字符n到m次 '(....)' 分组匹配 \A 同^ 开头 \Z 同$ 结尾 \d 匹配数字 \D 匹配非数字 \w 匹配[A-Za-z0-9] \W 匹配非[A-Za-z0-9] \s 匹配空白字符,TAB自动为\t
print(re.findall('a\w+n','awnSsdaBilnlldGg')) = print(re.findall('a[a-zA-Z0-9]+n','awnSsdaBilnlldGg')) # ['awnSsdaBiln']
print(re.findall('a.+u$','duaklu') # [uaklu] $以u结尾 print(re.findall('aaa?','dsaaadiuoaaioa')) # [aaa,aa] 'aaa?' 返回前面那个a零次或者一次 可以匹配aaa或者aa
print(re.findall('[0-9]{3}','duan1nd432io2346k6j')) # 返回3个成组的数字,多于3个则只返回3个 print(re.findall('[0-9]{1,3}','duan1nd432io23423k6j')) # 返回1到3个成组的数字,一个组合多于3个则拆分 print(re.search('abc{3}','abcddfdseccabccc')) # [abccc] print(re.findall('abc{1,3}','abcddfdseccabccc'))# [abc,abcc,abccc]
print(re.search('abc|ABC','asdabc123ABC')) # 或 search >>> abc print(re.findall('abc|ABC','asdabc123ABC')) # 或 findall >>> abc , ABC print(re.search('(abc){2}(\|\|=){2}','ASDabcabc||=||=daf')) # 分组匹配 print(re.search('\A[0-9]+[a-z]\Z','123b') # 数字开头,小写字母结尾 高级分组匹配:
print(re.search('(?P[0-9]{6})(?P [0-9]{4})(?P [0-9]{2})','500107197012').groupdict()) #将数据传为字典 >>>{'name': '500107', 'birthday': '1970', 'month': '12'}
截断
print(re.search('\W+','dfa#dagad$dg')) #以特殊字符截断 >>>['dfa', 'dagad', 'dg']替换
print(re.sub('[0-9]+','#','asdf1231adfadf21314')) # 将数字以#替换 >>>[ asdf#adfadf# ]
9、xml模块
例子:xml_text.xml
2 2013 141100 5 2016 59900 69 2016 13600
import xml.etree.ElementTree as ET tree = ET.parse('xmltext.xml') root = tree.getroot() print(root.tag) for child in root: print(child.tag,child.attrib) for i in child: print(i.tag,i.text,i.attrib) for node in root.iter('year'): print(node.tag,node.text) #修改 for node_1 in root.iter('year'): new_year = int(node_1.text)+1 node_1.text = str(new_year) node_1.set('updated','yes') tree.write('xmltext.xml') #删除 for country in root.findall('country'): rank = int(country.find('rank').text) if rank>50: root.remove(country) tree.write('output.xml')
10、Configparser
import configparser config = configparser.ConfigParser() config['DEFAULT'] = { 'ServerAliveInterval':'45', 'Compression':'Yes', 'CompressionLevel':'9' } config['bitnucket.org'] = {} config['bitnucket.org']['User'] = 'hg' config['topsecret.server.com'] = {} topsecret = config['topsecret.server.com'] topsecret['Hose Port'] = '5022' topsecret['ForwardX11'] = 'no' config['DEFAULT']['ForwardX11'] = 'yes' with open('example.ini','w') as configfile: config.write(configfile) >>>>>>
[DEFAULT] serveraliveinterval = 45 compression = Yes compressionlevel = 9 forwardx11 = yes [bitnucket.org] user = hg [topsecret.server.com] hose port = 5022 forwardx11 = no