5.1 模块说明
5.2 模块
time datetime random os shutil json pickle shelve xml hashlib hmac 正则表达式 configparser
模块定义:
模块:从逻辑上来组织python代码(定义变量,函数,类,逻辑,其就是为了实现一个功能),本质就是.py结尾的python文件
包: 用来从逻辑上组织模块,与文件的区别就是带了一个__init__.py文件
模块导入: 导入模板就是把Python文件解释了一遍
import module_name #导入单个模块
import module_name1,module_name2,module_#** #导入多个模块
调用方法 module_name.方法
from module_file import * #导入模块中的所有方法及函数 (不建议使用)
from module_file import module_name #导入模块中的方法或函数 (也可以多个方法)
from module_file import module_name as alias #定义module_name别名
包导入: 导入包就是解释__init__文件
import py_pack_name # 执行包下面的 __init__.py文件 from module_name_packer import module_name
模块分类:
1、标准库
2、开源模块(第三方模块)
3、自定义
#time 模块
time.sleep() # (秒) print(time.time()) # 时间戳 1506492926.3223119 从1970年1月1日开始记秒 print(time.localtime()) # time.struct_time(tm_year=2017, tm_mon=9, tm_mday=27, tm_hour=14, tm_min=11, tm_sec=46, tm_wday=2, tm_yday=270, tm_isdst=0) time.strftime() # now_time=time.localtime() # print(time.strftime("%Y-%m-%d %H:%M:%S",now_time)) # 结果: 2017-09-27 14:04:27
ti=time.strptime('2017-09-27 14:15:26','%Y-%m-%d %H:%M:%S') # 格式化字符串打印的结果与time.time一样,但有值之后就能直接取出年月日值
print(ti.tm_hour) # 14 这样能直接打印出月份
# 将时间戳转换成时间
x=time.localtime(time.time()) print(time.strftime('%Y-%m-%d %X',x))
# 将当前时候转换为时间戳
print(time.mktime(time.localtime()))
# datetime 模块
import datetime print(datetime.datetime.now()) # 获取当前时间 2017-11-02 14:39:44.929088 print(datetime.datetime.now()+datetime.timedelta(3)) # 往前加3天 print(datetime.datetime.now()+datetime.timedelta(hours=-3)) # 3小时以前的时间
# random 随机数 限定0-1
print(random.random()) #随机获取一个0-1之间的随机数 print(random.randint(1,3)) # 从1-3随机挑选一个数 print(random.randrange(1,100)) # 随机生成一个范围内的数值 print(random.sample(['123','32','3'],2)) # 列表随机生成一个2位的数['32', '123'] print(random.choice(['1','2','3'])) # 随机生成一个数值
# chr 转换ascii码对应的数值表 如65对应A 65-91表示ASCII码的 A-Z
常见字符的ASCII码值如下:空格的ASCII码值为32;数字0到9的ASCII码值分别为48到57;大写字母“A”到“Z”的ASCII码值分别为65到90;小写字母“a”到“z”的ASCII码值分别为97到到122。
# 生成一个6位的随机生成数
import random def v_random(): a_num='' for i in range(6): r_num=random.choice([random.randrange(10),chr(random.randint(65,91)),chr(random.randint(97,122))]) a_num+=str(r_num) print(a_num) v_random() # 打印结果 cyY4N6
# 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.name 输出字符串指示当前使用平台。win->'nt'; Linux->'posix' os.environ 获取系统环境变量 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.sep 输出操作系统特定的路径分隔符,win下为"\\",Linux下为"/" os.linesep 输出当前平台使用的行终止符,win下为"\t\n",Linux下为"\n" os.pathsep 输出用于分割文件路径的字符串 os.system("bash command") 运行shell命令,直接显示 os.path.abspath(path) 返回path规范化的绝对路径 os.path.split(path) 将path分割成目录和文件名二元组返回 os.path.exists(path) 如果path存在,返回True;如果path不存在,返回False os.path.dirname(path) 返回path的目录。其实就是os.path.split(path)的第一个元素 os.path.basename(path) 返回path最后的文件名。如何path以/或\结尾,那么就会返回空值。即os.path.split(path)的第二个元素
# 跨平台需要 windows的是\ linux的是/
s=os.sep os.chdir(r'C:%sUsers\xiong\Desktop\untitled'%s) print(os.getcwd())
# shutil
shutil.copyfileobj(file_src,file_dst) file1= open('file_name.txt',encoding='utf-8') file2= open('file_name.txt','w',encoding='utf-8') shutil.copyfileobj(file1,file2) shutil.copymode(src,dst) #仅拷贝权限。内容,组,用户不变 shutil.copystat(源文件,目标文件) # 拷贝文件,以及状态信息 shutil.copy(源文件,目标文件) # 拷贝文件及权限 shutil.copy2(源文件,目标文件) # 拷贝文件及状态信息 shutil.copytree(源目录,目标目录) # 拷贝整个目录 shutil.rmtree(目录名称) # 删除整个目录(有风险) shutil.mak_archive(base_name,format,...) # 创建压缩包并返回文件路径 shutil.make_archive(r'C:\xx\day1','zip',r'C:\xx\day1') #压缩day1目录,并保存在xx目录下 类型是zip
base_name: 压缩包的文件名,也可以是压缩包的路径。只是文件名时,则保存至当前目录,否则保存至指定路径,
format: 压缩包种类,“zip”, “tar”, “bztar”,“gztar”
root_dir: 要压缩的文件夹路径(默认当前目录)
owner: 用户,默认当前用户
group: 组,默认当前组
logger: 用于记录日志,通常是logging.Logger对象
# json 序列化 只能处理简单的字典文件
json.dumps() 序列化字典 import json info = { "name":"xiong", "age": 50, "sex": 'man' } with open('json_test.txt','w',encoding='utf-8') as file: file.write(json.dumps(info)) # 用法一 # json.dump(info,file) # 用法二 json.loads() 反序列化字典 只能dump一次字典, with open('json_test.txt','r',encoding='utf-8') as file: # data=json.loads(file.read()) # 用法一 data=json.load(file) # 用法二 print(data)
pickle 序列化字典 可处理复制的字典,但只能在py上运行,其它语言不行
pickle.dumps() 序列化字典 相等于 pickle.dump(对象,文件) import pickle def du(hobby): print("hobby",hobby) info = { "name":"xiong", "age": 50, "hobby": du } with open('json_test.txt','wb') as file: file.write(pickle.dumps(info)) pickle.loads() 反序列化字典 相等于 pickle.load(文件) import pickle def du(hobby): print("hobby",hobby)
# 以二进制的方式查看,函数必须在反序列号中也存在,否则将会报错
with open('json_test.txt','rb') as file:
# 打开文件并以行的文件阅读
data=pickle.loads(file.read())
# 传递参数给函数,pickle 函数序列化中能在py中能使用,其它语言没法用
print(data['hobby']('cat'))
# shelve 模块 一个简单的k,v将内存数据通过文件持久化的模块,可以持久化任何pickle可支持的Py数据格式
import shelve,datetime w=shelve.open('shelve.txt') # 先打开一个文件 info={'age':222,'jobs':'it'} name=['xiong','ab'] w["info"]=info # 持久化数据 w["name"]=name w['date']=datetime.datetime.now() w.close() #关闭文件 # 查看shelve序列化的数据 w=shelve.open('shelve.txt') print(w.get("name")) print(w.get("info")) w.close() 打印结果['xiong', 'ab'] {'age': 222, 'jobs': 'it'} 2017-11-02 21:17:43.986210
# xml模块
import xml.etree.ElementTree as ET tree=ET.parse('xmltests.xml') # 打开xml文件 root=tree.getroot() # 获取xml文件树 print(root.tag) # 打印标签首页 for chi in root: # 循环标签首页 print(chi.tag,chi.attrib) # 打印标签中所有的标签以及属性 for i in chi: print(i.tag,i.text,i.attrib) # 打印内容标签,内容,以及属性资料
# 只打印xml中树中某一个键值对的信息
for i in root.iter('gdppc'): print(i.tag,i.text) import hashlib m=hashlib.md5() print(m) m.update('hello'.encode('utf8')) print(m.hexdigest())
configparser模块
# 给配置文件中写入内容
import configparser conf=configparser.ConfigParser() # 文件操作句柄 conf['DEFAULT']={'one1':'1', 'two2':'2'} conf['DEFAULT']['three3']='3' with open('conf.tini','w',encoding='utf-8') as confile: conf.write(confile)
configparser模块_查看
# 打印文件的全部内容,以元组的形式
with open('conf.tini','r',encoding='utf-8') as xx: for i in xx: print(i.split())
# 读配置文件中的sections, DEFAULT无法打印出来, 需要其它选项
conf.read('conf.ini')
print(conf.sections())
# 打印结果 ['test2']
# 打印DEFAULT键值对的值
print(conf.defaults())
# 打印结果 OrderedDict([('one1', '1'), ('two2', '2'), ('three3', '3')])# OrderedDict有序的排序
# 判断键是否存在配置文件中
print('test2' in conf)
# 结果: True
print('test3' in conf)
# 结果: False
# 取出配置文件中键值
print(conf['test2']['test'])
# 结果: test1
# 打印某个键
for i in conf['test2']:
print(i)
# 打印结果: 打印这个键的时候 它也会打印出DEFAULT的特殊值
test
test2
one1
two2
three3
# 删除配置文件中的键值
conf=configparser.ConfigParser() # 定义一个操作句柄,没有这个配置操作会出错 conf.read('conf.tini') # 每次操作的时候一定要先打开文件然后再操作 conf.remove_section('test2') # 删除键 conf.write(open('conf.tini','w')) # 修改删除键的配置文件,此处需要注意的是这里是覆盖原文件
# 只是修改覆盖而不是直接删除
conf.remove_option('test3','ess') 选项 键,值
# 键 值 内容
conf['test3']['ess']='333' # 新加一个键 conf.set('test3','ess','4444') # 删除新加的键
# 删除配置的选项
conf.remove_option('xxxxx','xx3') conf.write(open('confi.txt','w',encoding='utf-8'))
# 注意要修改或删除某个值时,一定要带有 操作句柄以及修改文件的目录
conf=configparser.ConfigParser() conf.write(open('conf.tini','w'))
# hashlib 模块
import hashlib m2=hashlib.md5() # md5加密 m2.update(b'A97yd2') # 设置一个md5加密密码 print(m2.hexdigest()) # 打印16进制的数值出来
# hmac 模块 中文字符需要encode
h = hmac.new(b'teststs') print(h.hexdigest())
正则表达式
re(正则表达式) 是py引入的一个接口
元字符
b 表示一次或零次 .:匹配任意单个字符 [] 中括号 : 匹配指定范围内的任意单个字符,取消元字符的特殊功能() [^字符] 意味着取反 []中所有的非 [^]中括号加尖括号: 匹配指定范围之外的任意单个字符 逻辑非 匹配字符次数:(贪婪模式.*尽可能长的匹配) () 一个组内容 | 或 a|b a或者b *:匹配其前面的字符 0到无穷次 +: 至少匹配1次到无穷次 ?: 可以匹配 0次或1次 惰性匹配 .* : 任意长度的任意字符 {m,n}:匹配其前面的字符至少m次,至多N次 {0,} 等于无穷次 {0,1} 等于? {6}至少六次 {1,3}最多三次
位置锚定:
^ :锚定行首,此字符后面的匹配到的任意内容必须出现在行首 $ :锚定行尾,此字符后面的匹配到的任意内容必须出现在行尾 []字符集: [1,2,3]表示只要有其中一个就能获取 \ 反斜杠后边跟元字符去除特殊功能 反斜杠后边跟普通字符实现特殊功能 \d 匹配任何十进制数;它相当于类 [0-9]。 \D 匹配任何非数字字符;它相当于类 [^0-9]。 \s 匹配任何空白字符;它相当于类 [ \t\n\r\f\v]。 \S 匹配任匹配任何字母数字字符;它相当于类何非空白字符;它相当于类 [^ \t\n\r\f\v]。 \w [a-zA-Z0-9_]。 \W 匹配任何非字母数字字符;它相当于类 [^a-zA-Z0-9_] \b 匹配一个特殊字符边界,比如空格 ,&,#等 ?P固定格式起一个名字 ret=re.search(r'(?P [a-z]{3})\.(?P \w*)','www.baidu.com') print(ret.group('www')) print(ret.group('domain')) 打印结果: www baidu
匹配出满足条件的第一个结果
xx.search('xx','sdfasdffdsxx').group() # 不加.group打印出来的是一个对象
方法
# 查找 findall(pattern, string, flags=0) 1、findall(): 所有结果都返回到一个列表中 # 使用: findall(匹配规则,内容) 2、search() : 返回一个对象(object), 对象可以调用group() 方法来获取返回结果 3、match() : 只在字符串开始匹配 跟 ^锚定类式 4、split() : 分割换行 5、sub() : sub('规则','替换的新内容','替换内容') re.sub('x..x','ax','xyyx') 打印结果: ax 6、compile() : 将规则预先定义好, 然后再使用 # findall会先打印出组内的内容, print(re.findall('www\.(163|222)\.com' , "www.163.com")) # 打印结果: ['163'] # 取消优先打印组内的内容,将结果全部打印出来 print(re.findall('www\.(?:163|222)\.com' , "www.163.com")) # 打印结果: ['www.163.com']
configparser模块
# 给配置文件中写入内容
import configparser conf=configparser.ConfigParser() # 文件操作句柄 conf['DEFAULT']={'one1':'1', 'two2':'2'} conf['DEFAULT']['three3']='3' with open('conf.tini','w',encoding='utf-8') as confile: conf.write(confile)
configparser模块_查看
# 打印文件的全部内容,以元组的形式 with open('conf.tini','r',encoding='utf-8') as xx: for i in xx: print(i.split()) # 读配置文件中的sections, DEFAULT无法打印出来, 需要其它选项 conf.read('conf.ini',encoding='utf-8') print(conf.sections()) # 打印结果 ['test2'] # 打印DEFAULT键值对的值 print(conf.defaults()) # 打印结果 OrderedDict([('one1', '1'), ('two2', '2'), ('three3', '3')]) # OrderedDict有序的排序 # 判断键是否存在配置文件中 print('test2' in conf) # 结果: True print('test3' in conf) # 结果: False # 以列表打印出该配置段中所有的选项 print(conf.items('test2')) # 结果: [('name', 'xx'), ('age', 'man'), ('human', 'y')] # 取出配置文件中键值 print(conf['test2']['test']) # 结果: test1 # 打印某个键 for i in conf['test2']: print(i) # 打印结果: 打印这个键的时候 它也会打印出DEFAULT的特殊值 test test2 one1 two2 three3
添加
# 添加一个配置段 conf=configparser.ConfigParser() # 创建一个对象 conf.add_section('test') # 添加配置段 conf.set('test','name','xiong') # 添加配置段文件 conf.write(open('i.ini','w')) # 修改并添加文件 修改 # 删除配置文件中的键值 conf=configparser.ConfigParser() # 定义一个操作句柄,没有这个配置操作会出错 conf.read('conf.tini') # 每次操作的时候一定要先打开文件然后再操作 conf.remove_section('test2') # 删除整个标题 conf.write(open('conf.tini','w')) # 修改删除键的配置文件,此处需要注意的是这里是覆盖原文件 # 只是修改覆盖而不是直接删除 conf.remove_option('test3','ess') 选项 键,值 # 键 值 内容 conf['test3']['ess']='333' # 新加一个键 conf.set('test3','ess','4444') # 删除新加的键
# 注意要修改或删除某个值时,一定要带有 操作句柄以及修改文件的目录
conf=configparser.ConfigParser() conf.write(open('conf.tini','w'))