Python学习:9.模块的安装以及调用模块
Posted Alexsel
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Python学习:9.模块的安装以及调用模块相关的知识,希望对你有一定的参考价值。
什么是模块
在Python中,模块其实也就是包含python代码的文件,我们为什么要使用模块?在我们以后写代码的时候,我们会发现有很多功能需要经常使用,那我们想要使用这些功能怎么办,要再把那些代码在敲一遍吗,这样不但增加了代码量,还浪费了时间,有人说我们可以写在函数里,是的,我们可以把一些功能写在函数里,使用的时候调用函数就行了,但是我们每次新建一个文件的时候,都需要再次将那些功能函数写一遍,还是有些麻烦,这时候,模块的便捷就体现出来了,我们将大量功能函数写在一个py文件里,当我们需要用到部分功能的时候,将这个文件(模块)导入一下,就可以轻松地调用里面的函数了。当然模块中不仅可以写函数,也可以写类。
模块的调用
1.import语句,用于导入整个模块
import module1 import module as module_a #给导入的模块自定义一个别名 import sys import time as ti
2.form..import,用于导入模块的某一部分功能或模糊导入
from module import name from random import * #导入random中所有属性
使用import导入模块内部机制
import语句导入指定的模块时会执行3个步骤
1. 找到模块文件:在模块搜索路径下搜索模块文件
程序的主目录
PYTHONPATH目录
标准链接库目录
2.编译成字节码:文件导入时会编译,因此,顶层文件的.pyc字节码文件在内部使用后会被丢弃,只有被导入的文件才会留下.pyc文件
3.执行模块的代码来创建其所定义的对象:模块文件中的所有语句从头至尾依次执行,而此步骤中任何对变量名的赋值运算,都会产生所得到的模块文件的属性
注意:模块只在第一次导入时才会执行如上步骤,后续的导入操作只不过是提取内存中已加载的模块对象,reload()可用于重新加载模块
自定义模块
所谓的自定义模块就是自己创建一个python文件,在里面写入了一些函数或者类,在自己定义文件名的时候,注意不能把自己文件的名字定义和已经存在的模块的名字重复,否则导入模块的时候可能导入的模块不是你想要的模块。
先在一个.py文件内写一个函数,然后再另一个文件内import 文件名,然后再写使用文件名.函数名调用函数。
import 文件名 文件名.函数名()
导入模块时需要根据sys.path的路径找,为了我们自定义的模块可以成功导入,我们需要把自己写的py文件的路径添加到sys.path。
import sys sys.path.append("d:") #这个"d:"是你py文件放置的位置
查看模块搜索路径有哪些,自己添加的路径是否在搜索路径中。
import sys for i in sys.path: print(i)
内置模块
内置模块是python自带功能,使用的时候直接使用import或者from..import导入模块即可。
python中有哪些内置模块,接下来就介绍一下:
一、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\') 获取文件/目录信息 import os info = os.stat("D:\\\\文件名,需带后缀") print(info)
os.sep 操作系统特定的路径分隔符,win下为"\\\\",Linux下为"/" os.linesep 当前平台使用的行终止符,win下为"\\t\\n",Linux下为"\\n" os.pathsep 用于分割文件路径的字符串 os.name 字符串指示当前使用平台。win->\'nt\'; Linux->\'posix\' os.system("bash command") 运行shell命令,直接显示 import os os.system("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[, ...]])** 将多个路径组合后返回,第一个绝对路径之前的参数将被忽略 import os str1 = "D:" str2 = "home" str3 = "index" n = os.path.join(str1,str2,str3) print(n) #结果 #自己根据顺序添加分割符 D:home\\index
os.path.getatime(path) 返回path所指向的文件或者目录的最后存取时间 os.path.getmtime(path) 返回path所指向的文件或者目录的最后修改时间
二、sys
用于提供对python解释器相关的操作
1 sys.argv 命令行参数List,第一个元素是程序本身路径 2 sys.exit(n) 退出程序,正常退出时exit(0) 3 sys.version 获取Python解释程序的版本信息 4 sys.maxint 最大的Int值 5 sys.path 返回模块的搜索路径,初始化时使用PYTHONPATH环境变量的值 6 sys.platform 返回操作系统平台名称 7 sys.stdin 输入相关 8 sys.stdout 输出相关 9 sys.stderror 错误相关
三、hashlib
用于加密相关的操作,代替了md5模块和sha模块,主要提供 SHA1, SHA224, SHA256, SHA384, SHA512 ,MD5 算法。
import hashlib ########md5#########
hash = hashlib.md5() hash.update(bytes("admin", encoding="utf-8")) print(hash.hexdigest()) print(hash.digest()) ######## sha1 ######## hash = hashlib.sha1() hash.update(bytes(\'admin\', encoding=\'utf-8\')) print(hash.hexdigest()) # ######## sha256 ######## hash = hashlib.sha256() hash.update(bytes(\'admin\', encoding=\'utf-8\')) print(hash.hexdigest()) # ######## sha384 ######## hash = hashlib.sha384() hash.update(bytes(\'admin\', encoding=\'utf-8\')) print(hash.hexdigest()) # ######## sha512 ######## hash = hashlib.sha512() hash.update(bytes(\'admin\', encoding=\'utf-8\')) print(hash.hexdigest()) #以上加密算法虽然依然非常厉害,但时候存在缺陷,即:通过撞库可以反解。所以,有必要对加密算法中添加自定义key再来做加密。 import hashlib # ######## md5 ######## hash = hashlib.md5(bytes(\'898oaFs09f\', encoding="utf-8")) hash.update(bytes(\'admin\', encoding="utf-8")) print(hash.hexdigest()) #python内置还有一个hmac模块,它内部对我们创建key和内容进行进一步的处理然后再加密 import hmac h = hmac.new(bytes(\'898oaFs09f\', encoding="utf-8")) h.update(bytes(\'admin\', encoding="utf-8")) print(h.hexdigest()) #加盐值的加密(加密两次的加密) import hashlib # 自己加的加密规则 hash = hashlib.md5(bytes("admafasdin", encoding="utf-8")) hash.update(bytes("admin", encoding="utf-8")) print(hash.hexdigest())
四、re
python中提供了正则表达式相关操作
re.match()
#从头匹配
#最开始哪个字符(或字符串)开始匹配上后面的全部忽略
#简单
#分组
无分组
# 无分组 import re origin = "hello alex bcd alex lge alex acd 19" r = re.match("h\\w+", origin) print(r.group()) # 获取匹配到的所有结果 print(r.groups()) # 获取模型中匹配到的分组结果 print(r.groupdict()) # 获取模型中匹配到的分组结果 结果 hello () {}
分组
# 分组 # 分组的用处:从已经匹配到的字符串里在获取其中的某个字符 import re origin = "hello alex bcd alex lge alex acd 19" r = re.match("h(\\w+)", origin) print(r.group()) # 获取匹配到的所有结果 print(r.groups()) # 获取模型中匹配到的分组结果(括号(组)里的内容) print(r.groupdict()) # 获取模型中匹配到的分组结果 结果: hello (\'ello\',) {}
#有组(括号)只有groups可以匹配到,有key只有gruopdict可以匹配到
origin = "hello alex bcd alex lge alex acd 19"
r = re.match("(h)\\w+", origin) print(r.groups()) # 获取模型中匹配到的分组结果 结果:(\'h\',) r = re.match("?P<n1>h(\\w+)", origin) # ?P<x> x为key字典类型 print(r.groupdict()) # 获取模型中匹配到的分组结果 r = re.match("?P<n1>h(?P<n2>\\w+)", origin) # key ?P<> 的值为后面的字符串 print(r.groupdict()) # 获取模型中匹配到的分组结果 结果: {\'n1\': \'h\'} {\'n1\': \'h\', \'n2\': \'ello\'}
re.search()
浏览全部字符串,匹配第一个符合规则的字符串
和match用法差不多,search只不过这个全部浏览,一个一个字符的匹配
origin = "hello alex bcd alex lge alex acd 19" r = re.search("a\\w+", origin) print(r.group()) # 获取匹配到的所有结果 print(r.groups()) # 获取模型中匹配到的分组结果 print(r.groupdict()) # 获取模型中匹配到的分组结果
结果: alex () {} origin = "hello alex bcd alex lge alex acd 19" r = re.search("a(\\w+).*(?P<name>\\d)$", origin) print(r.group()) # 获取匹配到的所有结果 #上下两个也相同 print(r.groups()) # 获取模型中匹配到的分组结果#显示组的结果,忽略掉自己不匹配的比如?P<name> print(r.groupdict()) # 获取模型中匹配到的分组结果
结果: alex bcd alex lge alex acd 19 (\'lex\', \'9\') {\'name\': \'9\'} import re origin = "hello alex bcd alex lge alex acd 19" n = re.search("(a)(\\w+)",origin) print(n.group()) print(n.groups())
结果: alex (\'a\', \'lex\')
re.findall()
在字符串中找到正则表达式所匹配的所有子串,并返回一个列表,如果没有找到匹配的,则返回空列表。
import re re.findall("\\d+\\w\\d+","a2b3c4d5") #匹配时是逐个匹配,匹配到之后,下一轮匹配时就从他的后面开始匹配 结果:[\'2b3\', \'4d5\'] findall特别 print(re.findall("","asdfasdf")) 结果: [\'\', \'\', \'\', \'\', \'\', \'\', \'\', \'\', \'\']
当元素处理时,有几个括号就有几个组,就要分几个,如果第一个匹配了,第二个,没有匹配但是第二个可有可无,但是在第二个的位置上第三个匹配了,就会生成三个,其中一个留给没有匹配的,留的那个为空。
import re origin = "hello alex bcd alex lge alex acd 19" print(re.findall("a\\w+",origin)) print(re.findall("(a\\w+)",origin)) print(re.findall("a(\\w+)",origin)) #加括号以后,就行当于把按照规则匹配后,把括号里的输出,不在括号里的就不输出 结果: [\'alex\', \'alex\', \'alex\', \'acd\'] [\'alex\', \'alex\', \'alex\', \'acd\'] [\'lex\', \'lex\', \'lex\', \'cd\'] origin = "hello alex bcd alex lge alex acd 19" n = re.search("(a)(\\w+)", origin) print(re.findall("(a)(\\w+)",origin))#在规则都匹配过一次时,先把这些放在一个括号里,之后一次匹配放在一个括号里,再匹配再放 print(n.groups()) #结果第一个 结果: [(\'a\', \'lex\'), (\'a\', \'lex\'), (\'a\', \'lex\'), (\'a\', \'cd\')] (\'a\', \'lex\') #origin为上面的 print(re.findall("(a)(\\w+(e))(x)",origin)) 结果:#先找到a放进组里,再找到le放进组里,再从le里找到e放进组里,在找到x放进组里 [(\'a\', \'le\', \'e\', \'x\'), (\'a\', \'le\', \'e\', \'x\'), (\'a\', \'le\', \'e\', \'x\')] #括号的意思是从提取到的内容里再次提取内容,有几个括号提取几次 例子: origin = "hello alex bcd alex lge alex acd 19" print(re.findall("(a)((\\w+)(e))(x)",origin)) [(\'a\', \'le\', \'l\', \'e\', \'x\'), (\'a\', \'le\', \'l\', \'e\', \'x\'), (\'a\', \'le\', \'l\', \'e\', \'x\')] #详情请看199 import re a = "alex" n = re.findall("(\\w){4}",a)#理论上它输出了四次,但是它只有一个括号,所以取一个,而且默认去最后一个 n1 = re.findall("(\\w)(\\w)(\\w)(\\w)",a) n3 = re.findall("(\\w)*",a)详解199 24 print(n) print(n1) print(n3) 结果 [\'x\'] [(\'a\', \'l\', \'e\', \'x\')] [\'x\', \'\'] #findall其实就是search的groups组合而来 #当加有*时,前面那个可有可无所以当匹配不到或匹配到最后时,会以空的再匹配一次???? import re n = re.findall("(\\dasd)*","1asd2asdp3asd98kif") print(n) #结果 #那么多空,因为贪婪匹配 #连续两次匹配到就去后面那个,带括号情况下 [\'2asd\', \'\', \'3asd\', \'\', \'\', \'\', \'\', \'\', \'\'] #详解200 6 or 7
re.finditer()
和 findall 类似,在字符串中找到正则表达式所匹配的所有子串,并把它们作为一个迭代器返回。
import re origin = "hello alex bcd alex lge alex acd 19" r = re.finditer("(a)((\\w+)(e))(?P<n1>x)",origin) print(r) for i in r: print(i,i.group(),i.groups(),i.groupdict())
结果: <callable_iterator object at 0x0000000687374C50> <_sre.SRE_Match object; span=(6, 10), match=\'alex\'> alex (\'a\', \'le\', \'l\', \'e\', \'x\') {\'n1\': \'x\'} <_sre.SRE_Match object; span=(15, 19), match=\'alex\'> alex (\'a\', \'le\', \'l\', \'e\', \'x\') {\'n1\': \'x\'} <_sre.SRE_Match object; span=(24, 28), match=\'alex\'> alex (\'a\', \'le\', \'l\', \'e\', \'x\') {\'n1\': \'x\'}
re.split()
方法按照能够匹配的子串将字符串分割后返回列表
import re origin = "hello alex bcd alex lge alex acd 19" ddd = "hello alex bcd alex ddaf lge alex acd 19" n = re.split("a\\w+", origin, 1) # 1为分割次数 n1 = re.split("a\\w+", ddd) print(n) print(n1) 结果 [\'hello \', \' bcd \', \' lge \', \' \', \' 19\'] [\'hello \', \' bcd \', \' dd\', \' lge \', \' \', \' 19\'] origin = "hello alex bcd alex lge alex acd 19" n = re.split("a(\\w+)", origin, ) print(n) 结果 # 因为被分割了,所以n有三个部分,就像下面,n[1]第一部分 n[2]第二部分 n[3]第三部分 [\'hello \', \'lex\', \' bcd alex lge alex acd 19\'] # 中括号里面的字符无需转意,但是正则表达式里的括号有特殊意义,所以正常情况下需要转意
re.sub()
替换匹配成功的指定位置的字符串
sub(模型,替换成什么,所要替换的字符串,替换到前几个,模式)
origin = "jhasdjas4dg564jskdbf5s41g56asg" str_n = re.sub("\\d+","KKK",origin,5) print(str_n)
结果 jhasdjasKKKdgKKKjskdbf5s41g56asg subn() #subn返回两个元素 origin = "jhasdjas4dg564jskdbf5s41g56asg" new_str,count = re.subn("\\d+","KKK",origin) print(new_str,count)
结果: #5为匹配个数 jhasdjasKKKdgKKKjskdbfKKKsKKKgKKKasg 5
五、json模块
用于字符串和python基本数据类型之间转换
json模块中提供了四个功能:dumps、dump、loads、load
import json result = json.loads(s)#将字符串类型转换为一种类型(看起来像什么转什么)但是需要完全符合那种类型的条件 print(result,type(result)) #json.loads用于将字典、列表、元组形式的字符串,转换为相应的字典、列表、元组 #json.dumps将基本数据类型转换为字符串 json.dump() json.load()#这两个基本不用,可以不记 机器学习python第三方模块lda包调用代码