Python常用模块
一、包
1.1 什么是包
包是一种形式,本质就是一个含有.py文件的文件夹。
1.2 为什么使用包
模块的第一个版本只有10个功能,但是未来在扩展版本的时候,模块名和用法应该最好不要去修改,但是这只是对使用者友好,而由于版本扩展,文件越来越大,模块设计者对模块的管理、维护会越来越复杂,因此我们可以使用包来扩展模块的功能。
1.3 如何使用包
1.3.1 模块和包
导入模块发生的三件事:
- 创建一个包的名称空间
- 执行py文件,将执行过程中产生的名字存放于名称空间中。
- 在当前执行文件中拿到一个名字aaa,aaa是指向包的名称空间的
导入包发生的三件事:
- 创建一个包的名称空间
- 由于包是一个文件夹,无法执行包,因此执行包下的.py文件,将执行过程中产生的名字存放于包名称空间中(即包名称空间中存放的名字都是来自于.py)
- 在当前执行文件中拿到一个名字aaa,aaa是指向包的名称空间的
导入包就是在导入包下的.py,并且可以使用以下两种方式导入:
- import ...
- from ... import...
1.3.2 扩展模块功能
我们如果要扩展aaa.py模块,需要建立一个aaa的目录文件,并且删除aaa.py文件,将aaa.py修改成m1.py和m2.py两个文件,让模块的功能使用方法不改变。
1.3.3 修改 _init_.py文件
# aaa/.py
func1 = 111
func2 = 222
func3 = 333
func4 = 444
func5 = 555
func6 = 66
由于在__init__.py
中定义了func1,因此我们可以在run.py文件中导入func1,但是这个func1并不是我们想要的func1,因此需要修改__init__.py
文件,又由于执行文件run.py的环境变量不为aaa,因此直接使用import导入m1会报错,因此使用from导入。
# aaa/.py
from aaa.m1 import func1
from aaa.m2 import func2
# run.py
import aaa
print(aaa.func1())
print(aaa.func2())
1.3.4 导入内包
aaa.bbb指向aaa内部的文件夹bbb包,如果我们需要导入bbb这个包。
# bbb/.py
from aaa import bbb
# run.py
import aaa
print(aaa.bbb)
1.3.5 导入内包模块
# bbb/.py
from aaa.bbb import m3
# run.py
import aaa
aaa.bbb.m3
1.4 注意事项
- 包内所有的文件都是被导入使用的,而不是被直接运行的
- 包内部模块之间的导入可以使用绝对导入(以包的根目录为基准)与相对导入(以当前被导入的模块所在的目录为基准),推荐使用相对导入
- 当文件是执行文件时,无法在该文件内用相对导入的语法,只有在文件时被当作模块导入时,该文件内才能使用相对导入的语法
- 凡是在导入时带点的,点的左边都必须是一个包,
import aaa.bbb.m3.f3
错误
二、常用模块
2.1 time模块
time模块:支持三种不同形式的时间,不同形式的时间之间可以转换.
- 时间戳:从1970年1月1日00:00:00开始到现在的按秒计算的偏量
import time
print(time.time())
1565951647.1459594
- 格式化时间:将时间表示成字符串格式
import time
print(time.strftime('%Y-%m-%d %X'))
2019-08-16 18:38:09
- 结构化时间:struct_time元组共有九个元素,分别问年月日时分秒周天夏令时。
import time
print(time.localtime())
print(time.gmtime())
time.struct_time(tm_year=2019, tm_mon=8, tm_mday=16, tm_hour=18, tm_min=46, tm_sec=37, tm_wday=4, tm_yday=228, tm_isdst=0)
time.struct_time(tm_year=2019, tm_mon=8, tm_mday=16, tm_hour=10, tm_min=46, tm_sec=37, tm_wday=4, tm_yday=228, tm_isdst=0)
- 三种时间格式的转换
import time
print(time.strftime('%Y-%m-%d %X', time.localtime()))# 结构化时间转格式化时间
print(time.strptime('2019-08-16 10:30:44', '%Y-%m-%d %X'))# 格式化时间转结构化时间
print(time.mktime(time.localtime()))# 结构化时间转时间戳
print(time.localtime(time.time()))# 时间戳转结构化时间
- time.sleep(n)
2.2 datatime模块
datetime模块可以看成是时间加减的模块。
- 当前时间
import datetime
print(datetime.datetime.now())
2019-08-16 18:58:58.357782
- 增加减少时间(天)
import datetime
print(datetime.datetime.now()+datetime.timedelta(2))
2019-08-18 19:03:59.046982
- 增加减少时间(时、分)
import datetime
print(datetime.datetime.now()+datetime.timedelta(hours=12))
2019-08-17 07:06:07.106167
- 时间代替
import datetime
print(datetime.datetime.now().replace(hour = 10,second = 5,year = 1))
0001-08-16 10:11:05.001715
2.3 os模块
os模块负责程序与操作系统的交互,提供了访问操作系统的接口,多用于文件处理。
import os
print(os.getcwd()) # 获取当前文件目录
os.mkdir('m2') # 创建一个文件夹
os.rmdir('m2') # 删除文件夹
# # *************(经常用到)
res = os.listdir(r'D:...) # 列出所有文件
print(res)
__file__只有pychamr才提供,python本身不支持
print('os.path.abspath(__file__):',os.path.abspath(__file__)) # 支持不同的平台(windows,ios,andirod,linux,unix)
print('__file__:',__file__)
print(os.path.exists('01 包.py')) # 文件不存在False,存在True
print(os.path.isfile('01 包.py')) # 是否为文件
print(os.path.isdir('01 包.py')) # 是否为文件夹
# # ********(经常使用)
# # 支持不同的平台(windows,ios,andirod,linux,unix)
res = os.path.join(r'D:...') # 拼接文件路径
res = os.path.join(r'D:...') # 拼接文件路径
print(r'D:上海Python11期视频python11期视频day 17m1b'+'m5.py')
print(res)
# # ******* (经常使用)
print(os.path.abspath(__file__))
print(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
2.4 sys模块
sys模块负责程序与python解释器的交互,提供了一系列的函数和变量,用于操控python的运行时环境。
import sys
print(sys.argv) # 接收参数(用cmd执行文件时运行才有效)
print(sys.modules) #返回系统导入的模块字段,key是模块名,value是模块
2.5 json和pickle模块
jason和pickle都是序列化的方式,序列化就是把对象从内存中取出变成可储存或者传输的过程。
序列化的优点:
- 持久保存状态:内存是无法永久保存数据的,当程序运行了一段时间,我们断电或者重启程序,内存中关于这个程序的之前一段时间的数据(有结构)都被清空了。但是在断电或重启程序之前将程序当前内存中所有的数据都保存下来(保存到文件中),以便于下次程序执行能够从文件中载入之前的数据,然后继续执行,这就是序列化。
- 跨平台数据交互:序列化时不仅可以把序列化后的内容写入磁盘,还可以通过网络传输到别的机器上,如果收发的双方约定好实用一种序列化的格式,那么便打破了平台/语言差异化带来的限制,实现了跨平台数据交互。
Json序列化并不是python独有的,json序列化在java等语言中也会涉及到,因此使用json序列化能够达到跨平台传输数据的目的。
import json
dic = {'a': 1, 'b': 'abc', 'c': None}
data = json.dumps(dic) # 序列化到内存中
print(data,type(data)) # 单引号全部变成双引号
data = json.loads(data) # 从内存中获取json串
print(data,type(data))
{"a": 1, "b": "abc", "c": null} <class 'str'>
{'a': 1, 'b': 'abc', 'c': None} <class 'dict'>
Pickle序列化和所有其他编程语言特有的序列化问题一样,它只能用于Python,并且可能不同版本的Python彼此都不兼容,因此,只能用Pickle保存那些不重要的数据,即不能成功地反序列化也没关系。但是pickle的好处是可以存储Python中的所有的数据类型,包括对象,而json不可以。
2.6 hashlib和hmac模块
hash是一种算法,该算法接受传入的内容,经过运算得到一串hash值。
hash值的特点:
-
只要传入的内容一样,得到的hash值一样,可用于非明文密码传输时密码校验。
-
不能由hash值返解成内容,即可以保证非明文密码的安全性。
-
只要使用的hash算法不变,无论校验的内容有多大,得到的hash值长度是固定的,可以用于对文本的哈希处理。
hashlib能将数字变成固定的字符串, 相同的字符串哈希后结果一样并且具有 叠加性。
import hashlib m = hashlib.md5() # 固定的写法 m.update(b'123456') print(m.hexdigest()) e10adc3949ba59abbe56e057f20f883e
hmac模块:对密码加密,可以加盐,相当于给密码加了密钥。
import hmac m = hmac.new(b'abc') # 加盐 m.update(b'123456') print(m.hexdigest()) 8c7498982f41b93eb0ce8216b48ba21d