Python基础学习(16)主要模块
一、今日内容大纲
- time 模块
- datetime 模块
- os 模块
- sys 模块
- json 模块
- pickle 模块
- hashlib 模块
- collection 模块
二、变量类别
可在Pycharm
自动补全功能中经常看到:
C
:Class
类m
:Method
方法F
:Function
函数f
:Field
域V
:Variable
变量p
:property
属性p
:parameter
参数
三、time 模块
封装了获取时间戳和字符串形式地时间的一些方法。
-
三大对象
- 时间戳 timestamp
- 格式化时间对象 format time object
- 时间字符串 time string
-
获取时间戳
时间戳:从时间元年(1970-01-01 00:00:00)到现在经过的秒数(某些语言是毫秒数)。
print(time.time()) # 1594723794.3379405
-
获取格式化事件对象
格式化时间对象是一个名为 struct_time 的元组,元组中共有9个元素共九个元素:(年,月,日,时,分,秒,一年中第几周,一年中第几天,夏令时标记)。
print(time.gmtime()) # GMT(格林威治) 时间 print(time.localtime()) # 当地时间 # time.struct_time(tm_year=2020, tm_mon=7, tm_mday=14, tm_hour=10, tm_min=57, tm_sec=26, tm_wday=1, tm_yday=196, tm_isdst=0) print(time.localtime(1)) # 是时间元年过一秒,对应的时间对象
-
时间字符串
时间字符串需要通过格式化时间对象转化,转化为字符串易于阅读,而格式化事件对象易于传输。
# 将格式化时间对象转换成字符串 string-format-time s = time.strftime('%Y.%m.%d %H:%M:%S', time.gmtime()) # 将格林威治时间对象转换为字符串 s = time.strftime('%Y.%m.%d %H:%M:%S') # 默认转换当地的事件对象 # 将时间对象转换为时间字符串 string-parse-time time_obj = time.strptime('2010.10.10', '%Y.%m.%d') # 将字符串转换为时间对象
-
格式化事件对象转化为时间戳(了解)
print(time.mktime(time.gmtime())) # 1594697675.0
-
睡眠功能
可以通过
time.sleep()
实现当前运行程序的睡眠,主要用于开发过程。
四、datetime 模块
日期时间模块,封装了一些和日期时期相关的类,主要用于对时间进行数学运算,里面主要包含 date 类、time 类、datetime 类、timedelta 类等。
-
date 类
主要包含
year
,month
,day
三个属性(property)。d = datetime.date(2010, 10, 10) print(d) # 2010-10-10 # 获取date类的各个属性(property) print(d.year) print(d.month) print(d.day)
-
time 类
主要包含
hour
,minute
,second
三个属性。t = datetime.time(10, 48, 59) print(t) # 10:48:59 # 获取time类的各个属性(property) print(t.hour) print(t.minute) print(t.second)
-
datetime 类
相当于综合了 time 类和 date 类的功能,主要包含
year
,month
,day
,hour
,minute
,second
六个属性。dt = datetime.datetime(2010, 11, 11, 11, 11, 11) print(dt) # 2010-11-11 11:11:11
-
timedelta 类
是一种储存时间变化量的类,具有
days
,seconds
,microseconds
,milliseconds
,minutes
,hours
,weeks
属性等。# timedeleta类 td = datetime.timedelta(days=300) print(td) # 1 day, 0:00:00 # 创建时间运算:date,datetime,timedelta(和time类不能计算) # 时间变化量的运算会跨位运算 d = datetime.date(2010, 10, 10) res = d + td print(res) # 2011-08-06
# 练习:计算2100某一年的二月份有多少天 # 普通算法:根据年份计算是否是闰年 # 用datetime模块 import datetime d = datetime.date(2100, 3, 1) res = d - datetime.timedelta(days=1) print(res.day) # 28
五、os 模块
和底层操作系统相关的操作被封装在这个模块中。
-
和文件操作相关
-
删除文件:
os.remove(path)
:删除路径下的文件 -
重命名文件
os.rename(path_1, path_2)
:将路径一的文件修改为路径二的文件 -
删除目录(必须是空目录)
os.removedirs(path)
:删除路径所指的目录 -
扩展:利用 shutil(shell utility)模块删除带文件的目录
shutil.rmtree(path)
:彻底删除,慎用
-
-
和路径相关的操作
和路径相关的操作,都被封装在了 os 模块的子模块 os.path 中。
-
目录路径:
os.path.dirname(path)
:它不判断路径是否真是存在,直接返回目录路径。res = os.path.dirname(r'd:dsadsadasdas.aaa') print(res) # d:dsadsad
-
文件名:
os.path.basename(path)
:它不判断路径是否真实存在,返回文件名。res = os.path.basename(r'd:dsadsadasdas.aaa') print(res) # asdas.aaa
-
分割目录路径与文件名:
os.path.split(path)
:它不判断路径是否真实存在,将目录路径和文件名分开作为元组返回。res = os.path.split(r'd:dsadsadasdas.aaa') print(res) # ('d:\dsa\dsad', 'asdas.aaa')
-
拼接路径:
os.path.join(path, paths)
:它不判断路径是否真实存在,拼接路径,返回拼接后的路径。path = os.path.join('d:\', 'aaa', 'bbb.as') print(path) # d:aaabb.as
-
绝对路径:
os.path.abspath(path)
:它不判断路径是否真实存在,如果是开头的路径,返回的绝对路径是在当前盘符下,如果不是
开头,返回的绝对路径是当前项目路径。
path = os.path.abspath(r'ac') print(path) # D:ac path = os.path.abspath(r'ac') print(path) # D:PythonPython Projectday16ac
-
判断绝对路径:
os.path.isabs(path)
:它不判断路径是否真实存在,返回布尔值判断传入路径是否是绝对路径。print(os.path.isabs('a.txt')) # False print(os.path.isabs(r'c:a.txt')) # True
-
判断目录:
os.path.isdir(path)
:会判断目录是否真实存在,如果不是目录或者不存在会返回False
。print(os.path.isdir(r'c:Python')) # True
-
判断存在:
os.path.exists(path)
:会判断目录或者文件是否真实存在,返回布尔值。print(os.path.exists(r'c:Python')) # True
-
判断文件:
os.path.isfile(path)
:会判断文件是否真实存在,如果不是文件或文件不存在返回False
。print(os.path.isfile(r'c:Python')) # False
-
判断快捷方式:
os.path.islink(path)
:会判断快捷方式是否真实存在,如果不存在或者不是快捷方式返回False
。
-
六、sys 模块
封装和 Python 解释器相关的操作。
-
命令行参数
sys,agrv
全称为 argument variable 获取命令行参数,以列表形式返回,列表第一个元素为文件路径。
print(sys.argv) # ['D:/Python/Python Project/day16/04 sys模块.py']
-
模块查找路径
sys.path
以列表形式返回模块查找路径,可以在程序中动态地临时修改。
-
已加载模块
sys.modules
返回系统已经加载的模块,以字典形式返回,不可以动态地修改(可能会引起程序错误)。
七、json 模块
是 JavaScript Object Notation 的简称,是一种简单的数据交换格式,用于结构化数据和线性数据的转化,而 json 只能将数据和字符串之间进行转化,用于存储或者网络传输(不太彻底,没有彻底转换为二进制字节形式)。
-
序列化过程和反序列化过程
- 序列化过程 serialization :将结构化数据转化为线性数据,将内存中的数据转换成字节形式用以保存在文件或网络传输。
- 反序列化过程 deserialization :将线性数据转化为结构化数据,将网络中获取的数据,转换成内存中原来的数据类型。
-
json.dump()
和json.dumps()
# json.dump() s = json.dumps([1,2,3]) # 把指定的对象转换成json格式的字符串 print(s) # '[1, 2, 3]' s = json.dumps((1, 2, 3)) # 元组序列化后,会变成列表 print(s) # '[1, 2, 3]' res = json.dumps(10) print(res) # '10' res = json.dumps({'name':'andy', 'age': 10}) print(res) # '{"name": "andy", "age": 10}' # res = json.dumps(set('abs')) # TypeError: Object of type 'set' is not JSON serializable # 将json结果写入到文件中,通过json.dump() with open(r'json.txt',encoding='utf-8',mode='a') as file_handler: json.dump([1, 2, '12'], file_handler)
-
json.load()
和json.loads()
# 反序列化 res = json.dumps([1, 2, 3]) lst = json.loads(res) print(type(lst)) # <class 'list'> print(lst) # [1, 2, 3] # 元组反序列化变为列表 res = json.dumps((1,2,3)) lst = json.loads(res) print(type(lst)) # <class 'list'> print(lst) # [1, 2, 3] # 从文件中反序列化 with open(r'json.txt', encoding='utf-8') as file_handler: res = json.load(file_handler) # json文件通常是一次性写一次性读,所以json.load()只能一次性读文件 print(type(res)) # <class 'list'> print(res) # [1, 2, '12']
# 另一种方式,可以实现多次写多次读:把需要序列化的对象,通过多次序列化的方式, # 用文件的write方法,把多次序列化后的json字符串写到文件中 with open('json.txt', mode='a', encoding='utf-8') as file_handler: file_handler.write(json.dumps([1, 2, 3]) + ' ') file_handler.write(json.dumps([4, 5, 6]) + ' ') # 反序列化同理
八、pickle 模块
用以序列化过程和反序列化过程,将 Python 中所有的数据转换成字节形式;基本使用方法与 json 模块相同。
import pickle
bys = pickle.dumps((1,2,3))
print(type(bys)) # <class 'bytes'>
print(bys) # b'x80x03Kx01Kx02Kx03x87qx00.'
res = pickle.loads(bys)
print(res) # (1, 2, 3)
print(type(res)) # <class 'tuple'>
# 可以序列化反序列化任何数据类型
bys = pickle.dumps(set('abc'))
res = pickle.loads(bys)
print(res) # {'b', 'c', 'a'}
print(type(res)) # <class 'set'>
# pickle.dump和load序列化和反序列化可以多次读取,与json不同
# 把pickle序列化内容写入文件(二进制不涉及到encoding所以不设置encoding参实)
with open('pickle.txt', mode='wb') as file_handler:
pickle.dump([1, 2, 3], file_handler)
pickle.dump([3, 4, 5], file_handler)
# 反序列化
with open('pickle.txt', mode='rb') as file_handler:
ret1 = pickle.load(file_handler)
ret2 = pickle.load(file_handler)
print(ret1, type(ret1)) # [1, 2, 3] <class 'list'>
print(ret2, type(ret2)) # [3, 4, 5] <class 'list'>
# 在使用过程中要一次写一次读,多次会乱
json 模块和 pickle 模块的对比:
json 模块 | pickle 模块 |
---|---|
1.不是所有的数据类型都可以序列化 | 1.所有的pyhton类型都可以序列化 |
2.不能多次对同一个文件序列化 | 2.可以多次对同一个文件序列化 |
3.json数据可以跨语言读取 | 3.不能跨语言使用 |
九、hashlib 模块
用以封装一些加密的类。
-
加密
- 加密的目的:用于判断和验证,而并非解密
- 加密的特点:
- 把一个大的数据,切分成不同块进行加密,再汇总的结果,和直接对整体数据加密的结果是一致的。
- 单向加密不可逆。
- 原始数据一丁点小的变化,会导致结果有非常大的差异,即"雪崩"效应。
-
md5 加密算法
# 获取一个加密对象 m = hashlib.md5() # 使用加密对象的update,进行加密 m.update(b'abc') res1 = m.hexdigest() m.update('中文'.encode('utf-8')) # 只能接受二进制类型,中文转化成二进制 res2 = m.hexdigest() print(res1, res2) # 900150983cd24fb0d6963f7d28e17f72 1af98e0571f7a24468a85f91b908d335
-
数据加密的三大步骤
- 获取一个加密对象
- 使用加密对象的 update 算法(可以调用多次叠加加密)
- 通过 hexdigest() 方法或者 digest() 获取加密结果
-
不同加密方法的区别
# 不同的加密算法:实际上就是加密结果的长度不同 s = hashlib.sha224() s.update(b'abc') print(s.hexdigest()) # 23097d223405d8228642a477bda255b32aadbce4bda0b3f7e36c9da7 print(hashlib.md5().hexdigest()) # d41d8cd98f00b204e9800998ecf8427e print(hashlib.sha1().hexdigest()) # da39a3ee5e6b4b0d3255bfef95601890afd80709 print(hashlib.sha256().hexdigest()) # e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
-
加密对象的 salt
在创建加密对象时,可以指定参数,称为 salt 。
hashlib.md5(b'abc') # 相当于update了,与update结果是相同的
十、collection 模块
定义了一些容器类,包括collection.namedtuple()
、collection.defaultdict()
、collection.Counter()
等。
-
namedtuple()
命名元组# namedtuple():命名元组 from collections import namedtuple # 定义一个Rectangle类(自己定义的类名习惯上首字母大写) Rectangle = namedtuple('this_s_a_rectangle_class', ['length', 'width']) # Rectangle类的使用 r = Rectangle(10, 5) # 通过属性访问元组的元素 print(r.length) # 10 print(r.width) # 5 # 通过索引的方式访问元素 print(r[0]) # 10 print(r[1]) # 5
-
defaultdict()
默认值字典from collections import defaultdict dic = defaultdict(lambda :10,name='andy',age=10) print(dic['name']) # andy # 索引没有定义的值时,会按照工厂函数默认添加一个键值对,工厂函数不能有参数传入 print(dic['ad']) # 10 print(dic) # defaultdict(<function <lambda> at 0x000001DFCFEDBD90>, {'name': 'andy', 'age': 10, 'ad': 10})
-
Counter()
计数器from collections import Counter c = Counter('saddasadsad312544444sas') print(c) # Counter({'s': 5, 'a': 5, '4': 5, 'd': 4, '3': 1, '1': 1, '2': 1, '5': 1}) print(c.most_common(2)) # [('s', 5), ('a', 5)]