首页 > 代码库 > python之模块

python之模块

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

模块又分为三种

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

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

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

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].
格式化占位符

 random模块

生成随机数的模块。

常见几种方法

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

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

技术分享
import randomtemp = ‘‘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 randomtemp = ""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 += cprint(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下cdos.curdir                   返回当前目录: (‘.‘)os.pardir                   获取当前目录的父目录字符串名:(‘..‘)os.makedirs(‘dir1/dir2‘)    可生成多层递归目录os.removedirs(‘dirname1‘)   若目录为空,则删除,并递归到上一级目录,如若也为空,则删除,依此类推os.mkdir(‘dirname‘)         生成单级目录;相当于shell中mkdir dirnameos.rmdir(‘dirname‘)         删除单级空目录,若目录不为空则无法删除,报错;相当于shell中rmdir dirnameos.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不存在,返回Falseos.path.isabs(path)         如果path是绝对路径,返回Trueos.path.isfile(path)        如果path是一个存在的文件,返回True。否则返回Falseos.path.isdir(path)         如果path是一个存在的目录,则返回True。否则返回Falseos.path.join(path1[, path2[, ...]])  将多个路径组合后返回,第一个绝对路径之前的参数将被忽略os.path.getatime(path)      返回path所指向的文件或者目录的最后存取时间os.path.getmtime(path)      返回path所指向的文件或者目录的最后修改时间

hashlib模块

加密相关的模块

import hashlibprint(hashlib.md5())#<md5 HASH object @ 0x0000000000A61940>m = hashlib.md5()m.update("hello world".encode("utf8"))print(m.hexdigest())#5eb63bbbe01eeed093cb22bb8f5acdc3Md5加密后的结果显示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 > NOTSET,所以上述只能输出三种情况 

WARNING:root:warning messageERROR:root:error messageCRITICAL: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 logginglogger = 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 rea = 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 reret = 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 jsondic = {"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)
创建

 

 

 

  

 

python之模块