python 模块详解
模块内容区域
- 模块介绍
- time &datetime模块
- random
- os
- sys
- shutil
- json & picle
- shelve
- xml处理
- yaml处理
- configparser
- hashlib
- subprocess
- logging模块
- re正则表达式
模块介绍
1,定义
模块:用来从逻辑上组织python代码(变量,函数,类,逻辑:实现一个功能),
本质就是 .py 结尾的python文件(文件名 text.py 对应的模块名 text)
包:用来从逻辑上组织模块的,本质就一个目录(必须带有一个 __init__.py 文件)
2,导入方法
导入模块
import module_name
import module_name1,module_name2 (导入多个模块)
调用方式:
module_name1.hello()
from module_name import hello
from module_name import * (导入这个文件中所有的东西,等于代码写在引入的文件里)
调用方式:
hello() (文件中无重名函数)
module_name import hello as hello2(有重名函数情况下,可为模块中的函数更改名称)
(两种方法的函数调用方式不同)
导入包
import package_test
3,import 本质(路径搜索和搜索路径)
导入模块的本质就是把 python 文件解释一遍
import module_name -->module_name.py -->module_name.py的路径 -->sys.path
import module_name
原模块中的所有代码(解释过) 赋值给一个变量,module_name = all_code
使用方式:module_name.hello()
from module_name import hello
等同于模块的代码全部写在引入的文件里,对于模块中函数和变量,直接使用就好
使用方式:hello()
导入包的本质就是 执行包下的 __init__.py 文件
包里面有一个 __init__.py 文件
from day5 import package_test
package_test.test1.test()
4,导入优化
导入优化,多次调用一个函数时,使其不用重复 搜索模块
直接导入 函数方法
import module_test
from module_test import test
模块分类
1,标准库(python内置模块)
1 , time 与 datetime
time 时间戳
Timestamp
time.time()
格式化时间字符串 Format string
元组 struct_time()(共九个元素)
时间戳 Timestamp --> struct_time元组形式
gmtime: 结果为UTC时区
localtime: 结果为UTC + 8时区
元组形式 --> 时间戳
mktime
元组 < --> 格式化字符串
strftime("格式", struct_time) - --> "格式化的字符串"
strptime("格式化的字符串", "格式") --> struct_time
time.strftime("%Y-%m-%d %H:%M:%S", x)
time.strptime('2016-08-20 14:31:52', % Y - % m - % d % H: % M: % S)
2,random 模块
random.random()
random.randint(1,3)
range(1,3)
random.randrange(1,3)
random.choice("hello"/['a','b','c'])
random.sample('hello',2)
random.uniform(1,3)
l=[1,2,3,4,5,6]
random.shuffle(l) #打乱原顺序
# random 模块
# 随机生成四位的验证码并进行输入验证:数字,大小写字母
import random
while True:
checkcode=''
for i in range(4):
current = random.randint(1,9)
if current%2==0 and current>=5:
tmp = chr(random.randint(65,90))
elif current%2==0 and current<5:
tmp = chr(random.randint(97,122))
else :
tmp = random.randint(1,9)
checkcode += str(tmp)
print(checkcode)
s = input("请输入验证码:")
if s==checkcode:
print("输入正确")
break
else:
print("输入错误,请重新输入")
3,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('diename') 删除单级空目录,若目录不为空则无法删除,报错;相当于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->'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,否则返回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 所指向的文件或者目录的最后修改时间
4, sys 模块
sys.argv 命令行参数List,第一个元素是程序本身路径
sys.exit(n) 退出程序,正常退出时 exit(0)
sys.version 获取python解释器程序的版本信息
sys.maxint 最大的 Int 值
sys.path 返回模块的搜索路径,初始化时使用 PYTHONPATH环境变量的值
sys.platform 返回操作系统平台名称
sys.stdout.write('please:')
val = sys.stdin.readline()[:-1]
5, shutil 模块–高级的 文件,文件夹,压缩包 处理模块
shutil.copyfileobj(fsrc,fdst[,length]) 将文件内容拷贝到另一个文件中,可以部分内容
shutil.copyfile(src,dst) 拷贝文件
shutil.copymode(src,dst) 仅拷贝权限,内容,组,用户均不变
shutil.copystat(src,dst) 拷贝状态的信息,包括mode bits,atime,mtime,flags
shutil.copy(src,dst) 拷贝文件和权限
shutil.copy2(src,dst) 拷贝文件和状态信息
shutil.ignore_patterns(*patterns)
shutil.copytree(src, dst, symlinks=False, ignore=None) 递归的去拷贝文件
shutil.rmtree(path[,ignore_errors[,onerror]]) 递归的去删除文件
shutil.move(src,dst) 递归的去移动文件
shutil.make_archive(base_name,format,...) 创建压缩包并返回文件路径,例如:zip,tar
# shutil 模块的使用
import shutil
# f1 = open("本节笔记",encoding="utf-8")
#
# f2 = open("笔记2","w",encoding="utf-8")
# shutil.copyfileobj(f1,f2)
#shutil.copyfile("笔记2","笔记3")
#shutil.copystat("本节笔记","笔记3")
#shutil.copytree("test4","new_test4")
#shutil.rmtree("new_test4")
#shutil.make_archive("shutil_archive_test", "zip","E:\PycharmProjects\pyday1\day5")
import zipfile
z = zipfile.ZipFile("day5.zip","w")
z.write("p_test.py")
print("-----")
z.write("笔记2")
z.close()
6, json & pickle 模块
json 用于字符串和python数据类型间进行转换
四个功能:dumps,dump,loads,load
pickle 用于python特有的类型和python数据类型间进行转换
四个功能:dumps,dump,loads,loads
#import json
import pickle
def sayhi(name):
print("hello,",name)
info = {
'name':'alex',
'age':22,
'func':sayhi
}
f = open("test.text","wb")
#print(json.dumps(info))
print( )
f.write( pickle.dumps( info) )
f.close()
# import json
# import pickle
#
# def sayhi(name):
# print("hello ",name)
#
# info ={
# 'name':'baobaohui',
# 'age':22,
# 'func':sayhi
# }
#
# f = open("test.txt","w")
# # f.write(str(info))
#
# # print(json.dumps(info))
# f.write(json.dumps(info))
#
# f.close()
7, shelve 模块
shelve模块是一个简单的 key,value 将内存数据通过文件持久化的模块,可以持久化任何pickle可支持的python数据格式
import shelve
import datetime
d = shelve.open('shelve_test') # 打开一个文件
# 读取内容
print(d.get("name"))
print(d.get("info"))
print(d.get("date"))
# 持久化
# info = {'age':22,"job":'it'}
#
# name = ["baobaohui", "rain", "test"]
# d["name"] = name # 持久化列表
# d["info"] = info # 持久dict
# d['date'] = datetime.datetime.now()
# d.close()
8, xml 处理模块
xml是实现不同语言或程序之间进行数据交换的协议,跟json差不多,但json使用起来更简单,
不过在json还没诞生的黑暗年代,大家只能选择用xml,
至今很多传统公司如金融行业的很多系统的接口还主要是xml。
xml 修改
#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_by","baobaohui")
#
# 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')
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,i.attrib)
# 只遍历year 节点
for node in root.iter('year'):
print(node.tag, node.text)
xml 创建
import xml.etree.ElementTree as ET
new_xml = ET.Element("personinfolist")
personinfo = ET.SubElement(new_xml, "personinfo", attrib={"enrolled": "yes"})
name = ET.SubElement(personinfo, "name")
name.text = "Alex Li"
age = ET.SubElement(personinfo, "age", attrib={"checked": "no"})
sex = ET.SubElement(personinfo, "sex")
age.text = '56'
personinfo2 = ET.SubElement(new_xml, "personinfo", attrib={"enrolled": "no"})
name = ET.SubElement(personinfo2, "name")
name.text = "Oldboy Ran"
age = ET.SubElement(personinfo2, "age")
age.text = '19'
et = ET.ElementTree(new_xml) # 生成文档对象
et.write("test.xml", encoding="utf-8", xml_declaration=True)
ET.dump(new_xml) # 打印生成的格式
9, PyYAML 模块
Python也可以很容易的处理ymal文档格式,只不过需要安装一个模块
10, ConfigParser 模块
用于生成和修改常见配置文档。
当前模块的名称在 python 3.x 版本中变更为 configparser。
11, hashlib 模块
用于加密相关的操作,3.x里代替了md5模块和sha模块,
主要提供 SHA1, SHA224, SHA256, SHA384, SHA512 ,MD5 算法
import hashlib
#
# m = hashlib.md5()
# m.update(b"Hello")
# print(m.hexdigest())
# m.update(b"It's me")
# print(m.hexdigest())
# m.update(b"It's been a long time since we spoken...")
#
m2 = hashlib.md5()
m2.update("HelloIt's me天王盖地虎".encode(encoding="utf-8"))
print(m2.hexdigest())
#
# s2 = hashlib.sha1()
# s2.update(b"HelloIt's me")
# print(s2.hexdigest())
import hmac
h = hmac.new(b"12345","you are 250你是".encode(encoding="utf-8"))
print(h.digest())
print(h.hexdigest())
12, Subprocess 模块
13, logging 模块
很多程序都有记录日志的需求,并且日志中包含的信息即有正常的程序访问日志,还可能有错误、警告等信息输出,
python的logging模块提供了标准的日志接口,你可以通过它存储各种格式的日志,
logging的日志可以分为 debug(), info(), warning(), error() and critical() 5个级别,
14, re 模块–正则表达式
常用正则表达式
'.' 默认匹配除\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': '3714', 'city': '81', 'birthday': '1993'}
常用匹配语法
re.match 从头开始匹配
re.search 匹配包含
re.findall 把所有匹配到的字符放到以列表中的元素返回
re.splitall 以匹配到的字符当做列表分隔符
re.sub 匹配字符并替换
2,开源模块
3,自定义模块
泡泡:
这些模块算是先混个脸熟,等用到的时候继续学习。