一、定义
模块:用来从逻辑上组织python代码(变量,函数,类,逻辑:实现一个功能),本质就是.py结尾的python文件。
包:用来从逻辑上组织模块,本质就是一个目录(必须有一个__init__.py文件)
二、导入方法
import module_name
import module1_name,module2_name
from module import *(不建议使用)
from module import 方法名 as 别名
三、import本质(路径搜索和搜索路径)
import 模块名
第一种直接import 模块名的,当需要使用模块里的类、函数、变量等时,需要模块名字+类/函数/变量,表示你要使用这个模块下的类、函数、变量等,需要指定一下。实际上这种方式相当于把“模块名.py” 这个文件中的所有类、函数、常量、变量全都解释一遍赋值给 “模块名”。
from 模块名 import xxx (xxx可以是类,函数,常量等等)
第二种from 模块名 importxxx,这种直接使用模块下的某一个类,这样一次只能导入一个特定的类/函数/变量等,如果还想使用这个模块下的其他类,就得继续这样导入。实际上这种方式相当于直接把 “xxx” 这部分代码拿到当前文件下执行。
导入模块的本质就是把python文件解释一遍,导入包的本质就是执行该包下的__init__.py文件。
四、导入优化
import 模块名def test1():模块名.方法名() //第一次调用print("in the test1")def test2():模块名.方法名() //第二次调用print("in the test2")//上述两段函数重复调用同一个方法,效率降低,如何优化?from 模块名 import 方法名def test1():方法名() print("in the test1")def test2():方法名() print("in the test2")
五、模块的分类
1.标准库
a、time & datetime 模块
时间相关的操作,时间有三种表示方式:
①时间戳 1970年1月1日之后的秒,即:time.time()
②格式化的字符串 -11-11 11:11, 即:time.strftime('%Y-%m-%d')
③结构化时间元组包含了:年、日、星期等... time.struct_time 即:time.localtime()
b、random 模块
import randomprint(random.random()) #[0,1)之间的随机浮点数print(random.randint(1,5)) #random.randint(a,b)用于生成[a,b]范围内的整数print(random.randrange(1,5)) #random.randrange(start,stop,step),用于按指定步长获得一个[start,stop)a范围内随机数print(random.choice('hello')) #random.choice()从序列中获取一个随机元素,这里可以是列表、元组、字符串print(random.sample([1,2,3,4,5],3)) #random.sample(sequence,k),从指定序列中随机获取指定长度的片段#随机整数print(random.randint(1,100))#随机选取0~100之间偶数print(random.randrange(0,101,2))#随机浮点数print(random.random())print(random.uniform(1,10))#随机字符print(random.choice('abcdefg'))#选取特定数量的字符print(random.sample('abcdefg',3))#洗牌items = [1,2,3,4,5,6]random.shuffle(items)print(items)#4位验证码import randomcheckcode=''for i in range(4):current = random.randrange(0,4)#字母if current == i:tmp = chr(random.randint(65,90))#数字else:tmp = random.randint(0,9)checkcode += str(tmp)print(checkcode)
c、os 模块
os.getcwd() 获取当前工作目录,即当前python脚本工作的目录路径os.chdir("dirname") 改变当前脚本工作目录;相当于shell下cdos.curdir 返回当前目录: ('.')os.pardir 获取当前目录的父目录字符串名:('..')os.makedirs('dirname1/dirname2') 可生成多层递归目录os.removedirs('dirname1') 若目录为空,则删除,并递归到上一级目录,如若也为空,则删除,依此类推os.mkdir('dirname') 生成单级目录;相当于shell中mkdir dirnameos.rmdir('dirname') 删除单级空目录,若目录不为空则无法删除,报错;相当于shell中rmdir dirnameos.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 输出用于分割文件路径的字符串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所指向的文件或者目录的最后修改时间
d、sys 模块
sys.argv 命令行参数List,第一个元素是程序本身路径sys.exit() 退出程序,正常退出时exit(0)sys.version 获取Python解释程序的版本信息sys.maxint 最大的Int值sys.path 返回模块的搜索路径,初始化时使用PYTHONPATH环境变量的值sys.platform 返回操作系统平台名称sys.stdout.write('please:')val = sys.stdin.readline()[:-1]
e、shutil 模块
#将文件内容拷贝到另一个文件中,可以部分内容#shutil.copyfileobj(fsrc, fdst[, length])import shutilf1 = open("test",encoding="utf-8")f2 = open("test1","w",encoding="utf-8")shutil.copyfileobj(f1,f2)#拷贝文件#shutil.copyfile(src, dst)#仅拷贝权限。内容、组、用户均不变#shutil.copymode(src, dst)#拷贝状态的信息,包括:mode bits, atime, mtime, flags#shutil.copystat(src, dst)#拷贝文件和权限#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)'''#创建压缩包并返回文件路径,例如:zip、tarbase_name: 压缩包的文件名,也可以是压缩包的路径。只是文件名时,则保存至当前目录,否则保存至指定路径,如:www =>保存至当前路径如:/Users/wupeiqi/www =>保存至/Users/wupeiqi/format:压缩包种类,“zip”, “tar”, “bztar”,“gztar”root_dir:要压缩的文件夹路径(默认当前目录)owner:用户,默认当前用户group:组,默认当前组logger:用于记录日志,通常是logging.Logger对象'''#shutil.make_archive(base_name, format,...)# 将 /Users/amax/Downloads/test 下的文件打包放置当前程序目录import shutilret = shutil.make_archive("wwwwwwwwww", 'gztar', root_dir='/Users/amax/Downloads/test')# 将 /Users/amax/Downloads/test 下的文件打包放置 /Users/amax/目录import shutilret = shutil.make_archive("/Users/amax/wwwwwwwwww", 'gztar', root_dir='/Users/amax/Downloads/test')
f、json &pickle 模块
把一个字符串(或字节)保存到磁盘是一件很容易的事情,但是在实际编程中,我们经常要保存结构化的数据,如字典、嵌套列表等等,这时候就需要想办法把结构化数据先转化为字符串,这个转化过程就叫做“序列化”,这一过程的逆操作就是“反序列化”。
Python语言特定的序列化模块是pickle,但如果要把序列化搞得更通用、更符合Web标准,就可以使用json模块。
Json模块提供了四个功能:dumps、dump、loads、load
pickle模块提供了四个功能:dumps、dump、loads、load
(见Python IO编程/xjtuse123/article/details/94554448)
g、Xml 模块
xml是实现不同语言或程序之间进行数据交换的协议,跟json差不多,但json使用起来更简单,不过,在json还没诞生的年代,大家只能选择使用xml。
h、hashlib模块
用于加密相关的操作,3.x里代替了md5模块和sha模块,主要提供SHA1, SHA224, SHA256, SHA384, SHA512 ,MD5 算法。
import hashlibm = hashlib.md5()m.update(b"Hello")m.update(b"It's me")print(m.digest())m.update(b"It's been a long time since last time we ...")print(m.digest()) #2进制格式hashprint(len(m.hexdigest())) #16进制格式hash'''def digest(self, *args, **kwargs): # real signature unknown""" Return the digest value as a string of binary data. """passdef hexdigest(self, *args, **kwargs): # real signature unknown""" Return the digest value as a string of hexadecimal digits. """pass'''import hashlib# ######## md5 ########hash = hashlib.md5()hash.update('admin')print(hash.hexdigest())# ######## sha1 ########hash = hashlib.sha1()hash.update('admin')print(hash.hexdigest())# ######## sha256 ########hash = hashlib.sha256()hash.update('admin')print(hash.hexdigest())# ######## sha384 ########hash = hashlib.sha384()hash.update('admin')print(hash.hexdigest())# ######## sha512 ########hash = hashlib.sha512()hash.update('admin')print(hash.hexdigest())#python 还有一个 hmac 模块,它内部对我们创建 key 和 内容 再进行处理然后再加密import hmach = hmac.new(b'bibibibi', '中文'.encode(encoding="utf-8"))print (h.hexdigest())
i、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匹配字符并替换
反斜杠的困扰
与大多数编程语言相同,正则表达式里使用"\"作为转义字符,这就可能造成反斜杠困扰。假如你需要匹配文本中的字符"\",那么使用编程语言表示的正则表达式里将需要4个反斜杠"\\\\":前两个和后两个分别用于在编程语言里转义成反斜杠,转换成两个反斜杠后再在正则表达式里转义成一个反斜杠。Python里的原生字符串很好地解决了这个问题,这个例子中的正则表达式可以使用r"\\"表示。同样,匹配一个数字的"\\d"可以写成r"\d"。有了原生字符串,你再也不用担心是不是漏写了反斜杠,写出来的表达式也更直观。
2.开源模块
(1)下载安装
#方式一:直接安装yumpipapt-get...#方式二:源码安装下载源码解压源码 进入目录编译源码 python xxx.py build安装源码 python xxx.py install
(2)导入模块
见下3.自定义模块
3.自定义模块
(1)导入模块有以下几种方法:
import modulefrom module.xxx.xxx import xxfrom module.xxx.xxx import xx as renamefrom module.xxx.xxx import *
导入一个 .py 文件,解释器解释该py文件,导入一个包,解释器解释该包下的__init__.py文件
import osimport sys'''print(__file__)#获取当前程序路径,注意:这里打印出来的路径为相对路径#动态获取绝对路径print(os.path.abspath(__file__)) #这才是当前程序绝对路径print(os.path.dirname(os.path.abspath(__file__))) #当前程序上一级目录,其中dirname返回目录名,不要文件名print(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))#当前程序上上一级目录'''BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) #当前程序上上一级目录sys.path.append(BASE_DIR) #添加环境变量import model1import model2