python之模块

时间:2023-03-08 19:13:06

模块即一推代码的集合来实现某个功能,使用时直接调用,甚是方便。

模块又分为三种

  • 自定义模块
  • 内置模块
  • 第三方模块

下面就来介绍介绍什么是内置模块及如何去使用它和内置模块的好处。

使用模块模块前首先导入该模块,才能调用到该模块的功能。导入方法

import 模块名字

先来模块介绍常用的模块

time模块

和时间相关的操作,常见几种表现方式

time.time()时间戳
time.gmtime()结构化时间
time.localtime()本地时间
time.strftime()字符串时间
time.ctime()
time.mktime()

常见输出的格式化占位符

%Y  表示年
%m 表示月范围 [01,12].
%d 表示天范围 [01,31].
%H 表示小时范围 [00,23].
%M 表示分钟范围 [00,59].
%S 表示秒范围 [00,61].

格式化占位符

python之模块

random模块

生成随机数的模块。

常见几种方法

import random

print(random.random())
print(random.randint(1, 2))#左右都包括
print(random.randrange(1, 10))#包左不包右

最常见的例子就是生成随机验证码

import random
temp = ''
for i in range(4):
add_num = random.choice([random.randrange(0,10),chr(random.randrange(65,91))])
temp += str(add_num)
print(temp)

第一种

import random
temp = ""
for i in range(4):
num = random.randrange(0,4)
if num == 3 or num == 1:
li = random.randrange(0,10)
temp = temp + str(li)
else:
rad = random.randrange(65,91)
c = chr(rad)
temp += c
print(temp)

第二种

sys模块

主要公共是提供对python解释器的操作

sys.argv           命令行参数List,第一个元素是程序本身路径
sys.exit(n) 退出程序,正常退出时exit(0)
sys.version 获取Python解释程序的版本信息
sys.maxint 最大的Int值
sys.path 返回模块的搜索路径,初始化时使用PYTHONPATH环境变量的值
sys.platform 返回操作系统平台名称
sys.stdin 输入相关
sys.stdout 输出相关
sys.stderror 错误相关

os模块 

用于提供系统级别的操作

os.getcwd()                 获取当前工作目录,即当前python脚本工作的目录路径
os.chdir("dirname") 改变当前脚本工作目录;相当于shell下cd
os.curdir 返回当前目录: ('.')
os.pardir 获取当前目录的父目录字符串名:('..')
os.makedirs('dir1/dir2') 可生成多层递归目录
os.removedirs('dirname1') 若目录为空,则删除,并递归到上一级目录,如若也为空,则删除,依此类推
os.mkdir('dirname') 生成单级目录;相当于shell中mkdir dirname
os.rmdir('dirname') 删除单级空目录,若目录不为空则无法删除,报错;相当于shell中rmdir dirname
os.listdir('dirname') 列出指定目录下的所有文件和子目录,包括隐藏文件,并以列表方式打印
os.remove() 删除一个文件
os.rename("oldname","new") 重命名文件/目录
os.stat('path/filename') 获取文件/目录信息
os.sep 操作系统特定的路径分隔符,win下为"\\",Linux下为"/"
os.linesep 当前平台使用的行终止符,win下为"\r\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所指向的文件或者目录的最后修改时间

hashlib模块

加密相关的模块

import hashlib
print(hashlib.md5())#<md5 HASH object @ 0x0000000000A61940> m = hashlib.md5()
m.update("hello world".encode("utf8"))
print(m.hexdigest())#5eb63bbbe01eeed093cb22bb8f5acdc3
Md5加密后的结果显示 s = hashlib.sha256()
s.update("hello world".encode("utf8"))
print(s.hexdigest())#b94d27b9934d3e08a52e52d7da7dabfac484efe37a5380ee9088f7ace2efcde9
加密程度更安全 sha256加密算法虽然比md5的级别程度高,但是运行速度慢

logging模块

记录日志的信息功能模块,默认有5个等级

import logging
logging.debug('debug message')
logging.info('info message')
logging.warning('warning message')
logging.error('error message')
logging.critical('critical message')

5种日志级别等级CRITICAL > ERROR > WARNING > INFO > DEBUG ,所以上述只能输出三种情况 

WARNING:root:warning message
ERROR:root:error message
CRITICAL:root:critical message

两种打印日志的格式

import logging
logging.basicConfig(level=logging.DEBUG,
format='%(asctime)s %(filename)s[line:%(lineno)d] %(levelname)s %(message)s',
datefmt='%a, %d %b %Y %H:%M:%S',
filename='/tmp/test.log',
filemode='w') logging.debug('debug message')
logging.info('info message')
logging.warning('warning message')
logging.error('error message')
logging.critical('critical message')

打印日志文本

import logging
logger = logging.getLogger()
fh = logging.FileHandler("test.log",encoding="utf-8")
ch = logging.StreamHandler()
formatter = logging.Formatter("%(asctime)s -%(name)s - %(levelname)s - %(message)s") fh.setFormatter(formatter)
ch.setFormatter(formatter)
logger.addHandler(fh)
logger.addHandler(ch) logger.setLevel(logging.DEBUG)
logging.debug("debug message")
logging.info("info message")
logging.warning("warning messing")
logging.error("error message")
logging.critical("critical message")

屏幕和日志文本中

从上述可见,参数的表示意义为(如果更改就会报错,但可以根据自己需求选择其中几个显示打印出来)

  • filename:用指定的文件名创建FiledHandler(后边会具体讲解handler的概念),这样日志会被存储在指定的文件中。
  • filemode:文件打开方式,在指定了filename时使用这个参数,默认值为“a”还可指定为“w”。
  • format:指定handler使用的日志显示格式。
  • datefmt:指定日期时间格式。
  • level:设置rootlogger(后边会讲解具体概念)的日志级别
  • stream:用指定的stream创建StreamHandler。可以指定输出到sys.stderr,sys.stdout或者文件,默认为sys.stderr。若同时列出了filename和stream两个参数,则stream参数会被忽略。

对format中涉及的参数意义

  • %(name)s Logger的名字
  • %(levelno)s 数字形式的日志级别
  • %(levelname)s 文本形式的日志级别
  • %(pathname)s 调用日志输出函数的模块的完整路径名,可能没有
  • %(filename)s 调用日志输出函数的模块的文件名
  • %(module)s 调用日志输出函数的模块名
  • %(funcName)s 调用日志输出函数的函数名
  • %(lineno)d 调用日志输出函数的语句所在的代码行
  • %(created)f 当前时间,用UNIX标准的表示时间的浮 点数表示
  • %(relativeCreated)d 输出日志信息时的,自Logger创建以 来的毫秒数
  • %(asctime)s 字符串形式的当前时间。默认格式是 “2003-07-08 16:49:45,896”。逗号后面的是毫秒
  • %(thread)d 线程ID。可能没有
  • %(threadName)s 线程名。可能没有
  • %(process)d 进程ID。可能没有
  • %(message)s用户输出的消息

re模块

即正则表达式。我们知道在许多代码中如果要自己查找费事还不容易对,所以我们引入了正则进行模糊匹配。之前我们学习了字符串也能进行匹配查找,但是string提供的是完全匹配。不方便查找更多元素。

正则提供一种紧凑的表示法,可用于表示字符串的组合,之所以如此强大,是因为单独的正则表达式可以表示无限数量的字符串,只要满足正则规则即可。

常见的正则的5种用途

  • 分析:识别并提取符合特定标准的的文本
  • 搜索:定位可以有不止一种形式的字符串。
  • 搜索与替代:使用一个字符串对与正则匹配的对象进行替代。
  • 字符串分割:在与正则匹配的地方对字符串进行分割。
  • 验证:检测某段文本是否符合某些功能。

常用元字符

. ^ $ * + ? { } [ ] | ( ) \

. 通配符表示:能匹配一个字符re.findall("alex.f","yinfansfksdfalexfadf")
^ 尖角符表示: 只能匹配到的字符在首位re.findall("^alex","alexyinfansfksdffadf")
$ 表示:只能匹配到的字符在末尾re.findall("alex$","yinfansfksdffadfalex")
* 重复匹配表示:匹配*前一位字符0次到多次a = re.findall("alex*","alexxxx")
+ 表示:匹配+前一位字符1次到多次a = re.findall("alex*","alexxxx)
? 表示:匹配?前一位字符0次到1次a = re.findall("alex?","alexxxx)
{}表示:想匹配几次就几次 a = re.findall("alex{3}","alexxx")
{m} 匹配m次
{m,n}匹配m到n次
{1,}表示1到正无穷大
[] 字符集表示:匹配[]里的字符中的一个re.findall("a[bc]d","wwwwacd")
如果是[a-z]则表示匹配任意字符
[^0-9]表示匹配非数字以外的字符
\ 表示:后边跟元字符去除特殊功能
后边跟普通字符实现特殊功能
引用序号对应的字组所匹配的字符串
\d 匹配任何十进制数:相当于类 [0-9]
\D 匹配任何非数字字符:相当于类[^0-9]
\s 匹配任何空白字符:相当于类[\t\n\f\r\v]
\S 匹配任何非空白字符:相当于类[^\t\n\f\r\v]
\w 匹配任何字母数字字符:相当于类[a-zA-Z0-9]
\W 匹配任何非字母数字字符:相当于类[^a-zA-Z0-9]
\b 匹配一个特殊字符边界,也就是指单词和空格间的位置
()表示:做一个整体去匹配
| 表示:或的意思

常见方法

findall()所有结果都返回到一个列表里
search()返回一个对象,对象可以调用group()找到返回结果,只匹配第一个
match()只在字符串开始匹配,也只返回一个对象,用group()找到返回结果
split()分割re.split("[k,s]","djkgsal")#['dj','g','al']
sub()替换re.sub("a..b","affasff","saffbfs")
compile()#obj =re.compile("fa") 调用 obj.findall("afafsdff")

注:

  • re.I 表示对大小写不敏感
  • re.L 做本地化识别匹配
  • re.M 多行匹配,影响^ 和 $
  • re.S 使 . 匹配包括换行在内的所有字符

例如取多层运算最里层的括号的方法

import re

a = re.search("\([^()]*\)","1-2*((60-30+(-9-2-5-2*3-5/3-40*4/2-3/5+6*3)*(-9-2-2*5/3 +7/3*99/4*2998+10*568/14))-(-4*3)/(16-3*25))").group()
print(a) 输出结果
(-9-2-5-2*3-5/3-40*4/2-3/5+6*3)

  

import re
ret = re.findall('(?P<name>\w{2})/(?P<age>\d{2})',"45bd/34"ab"3")

json,pickle模块

主要用于序列化

  • json     用于【字符串】和 【python基本数据类型】 间进行转换
  • pickle   用于【python特有的类型】 和 【python基本数据类型】间进行转换

它们都提供了4个功能 dump,dumps,写入  load,loads 导出

import json
dic = {"name":"flash","age":19}
date = json.dumps(dic)
with open("jsosn_text","w") as f:
f.write(date)
date = json.dumps(dic) with open("json_text2","w") as f:
json.dump(dic,f) with open("jsosn_text","r") as f:
date = json.load(f)
print(date)

xml模块  

XML是实现不同语言或程序之间进行数据交换的协议,XML文件格式如下 

<data>
<country name="Liechtenstein">
<rank updated="yes">2</rank>
<year>2023</year>
<gdppc>141100</gdppc>
<neighbor direction="E" name="Austria" />
<neighbor direction="W" name="Switzerland" />
</country>
<country name="Singapore">
<rank updated="yes">5</rank>
<year>2026</year>
<gdppc>59900</gdppc>
<neighbor direction="N" name="Malaysia" />
</country>
<country name="Panama">
<rank updated="yes">69</rank>
<year>2026</year>
<gdppc>13600</gdppc>
<neighbor direction="W" name="Costa Rica" />
<neighbor direction="E" name="Colombia" />
</country>
</data>

创建

from xml.etree import ElementTree as ET

############ 解析方式一 ############

# 打开文件,读取XML内容
str_xml = open('xo.xml', 'r').read() # 将字符串解析成xml特殊对象,root代指xml文件的根节点
root = ET.XML(str_xml) ############ 操作 ############ # 顶层标签
print(root.tag) # 循环所有的year节点
for node in root.iter('year'):
# 将year节点中的内容自增一
new_year = int(node.text) + 1
node.text = str(new_year) # 设置属性
node.set('name', 'alex')
node.set('age', '18')
# 删除属性
del node.attrib['name'] ############ 保存文件 ############
tree = ET.ElementTree(root)
tree.write("newnew.xml", encoding='utf-8')

字符串修改保存

from xml.etree import ElementTree as ET

############ 解析方式二 ############

# 直接解析xml文件
tree = ET.parse("xo.xml") # 获取xml文件的根节点
root = tree.getroot() ############ 操作 ############ # 顶层标签
print(root.tag) # 循环所有的year节点
for node in root.iter('year'):
# 将year节点中的内容自增一
new_year = int(node.text) + 1
node.text = str(new_year) # 设置属性
node.set('name', 'alex')
node.set('age', '18')
# 删除属性
del node.attrib['name'] ############ 保存文件 ############
tree.write("newnew.xml", encoding='utf-8') 解析文件方式,修改,保存

文件修改保存

from xml.etree import ElementTree as ET

############ 解析字符串方式打开 ############

# 打开文件,读取XML内容
str_xml = open('xo.xml', 'r').read() # 将字符串解析成xml特殊对象,root代指xml文件的根节点
root = ET.XML(str_xml) ############ 操作 ############ # 顶层标签
print(root.tag) # 遍历data下的所有country节点
for country in root.findall('country'):
# 获取每一个country节点下rank节点的内容
rank = int(country.find('rank').text) if rank > 50:
# 删除指定country节点
root.remove(country) ############ 保存文件 ############
tree = ET.ElementTree(root)
tree.write("newnew.xml", encoding='utf-8')

字符串删除保存

from xml.etree import ElementTree as ET

############ 解析文件方式 ############

# 直接解析xml文件
tree = ET.parse("xo.xml") # 获取xml文件的根节点
root = tree.getroot() ############ 操作 ############ # 顶层标签
print(root.tag) # 遍历data下的所有country节点
for country in root.findall('country'):
# 获取每一个country节点下rank节点的内容
rank = int(country.find('rank').text) if rank > 50:
# 删除指定country节点
root.remove(country) ############ 保存文件 ############
tree.write("newnew.xml", encoding='utf-8')

文件删除保存

from xml.etree import ElementTree as ET

# 创建根节点
root = ET.Element("famliy") # 创建节点大儿子
son1 = ET.Element('son', {'name': '儿1'})
# 创建小儿子
son2 = ET.Element('son', {"name": '儿2'}) # 在大儿子中创建两个孙子
grandson1 = ET.Element('grandson', {'name': '儿11'})
grandson2 = ET.Element('grandson', {'name': '儿12'})
son1.append(grandson1)
son1.append(grandson2) # 把儿子添加到根节点中
root.append(son1)
root.append(son1) tree = ET.ElementTree(root)
tree.write('oooo.xml',encoding='utf-8', short_empty_elements=False)

创建