Python是个啥-第六章 模块
第六章 模块
Python 模块(Module),是一个 Python 文件,以 .py 结尾,包含了 Python 对象定义和Python语句。
模块让你能够有逻辑地组织你的 Python 代码段。把相关的代码分配到一个模块里能让你的代码更好用,更易懂。模块能定义函数,类和变量,模块里也能包含可执行的代码。
模块分类:内置模块、第三方模块、自定义模块。
6.1 内置模块
-
os
-
sys
-
shutil
-
hashlib
-
getpass
-
random
-
time
-
datetime
-
json
-
pickle
-
pickle
-
logging
6.1.1 os模块
- os.path.join() #文件拼接
- os.path.dirname() #获取文件的上级目录(路径最好转义,前面加r,例如:r"/home/gnome/abc.mp4")。
- os.path.abspath() #获取文件的绝对路径。
- os.path.exists() #判断路径是否存在,True,False。
- os.path.basename() #返回path中的文件名。
- os.path.getmtime(path) #文件或文件夹的最后修改时间,从新纪元到访问时的秒数。
- os.path.getatime(path) #文件或文件夹的最后访问时间,从新纪元到访问时的秒数。
- os.path.getctime(path) #文件或文件夹的创建时间,从新纪元到访问时的秒数。
- os.stat() #获取文件大小byte。
- os.listdir() #目录列表类似ls/dir功能,把所有的文件存在列表中.(结果需要用for才能看到结果)。
- os.walk() #目录下面的所有文件,包含所有层.(结果需要用for才能看到结果)。
- os.mkdir() #创建单层目录。
- os.makedirs() #创建单层或者多层目录(创建目录之前先检查路径是否存在如果存)。
- os.rename() #重命名。
import os
# 和操作系统相关的数据
os.path.exists() #判断路径是否存在,True,False.
os.path.abspath() #获取文件的绝对路径.
os.path.dirname() #获取文件的上级目录(路径最好转义,前面加r,例如:r"/home/gnome/abc.mp4")
os.stat().st_size #获取文件大小byte.
print(os.path.abspath("百家姓.log"))
print(os.path.dirname(r"D:\pyproject\百家姓.log"))
os.path.join() #文件拼接
path='/home/gnome'
file_path='a.txt'
full_path=os.path.join(path,file_path)
print(full_path) #/home/gnome/a.txt
os.listdir() #目录列表类似ls/dir功能,把所有的文件存在列表中.(结果需要用for才能看到结果)
os.walk() #目录下面的所有文件,包含所有层.(结果需要用for才能看到结果)
6.1.2 sys模块
sys is system, python解释器相关的数据。
- sys.getrefcount #获得一个值的应用计数
- sys.getrecursionlimit() #python默认支持的递归数
- sys.argv #获取执行脚本时,传入的参数[脚本文件路径,传入的第一个参数,传入的第二个参数]
- sys.path #获取系统中path的所有路径并保存在list里面
- sys.stdout.write #-->print ,其功能和\r相同
- sys.exit() #程序终止 exit(0) #无错误退出 ;exit(1) #有错误退出
- \r
import sys
sys.getrefcount #获得一个值的应用计数
sys.getrecursionlimit() #python默认支持的递归数
a=[1,22,3,32,2]
b=a
print(sys.getrefcount(a)) #函数被引用的计数,引用计数器(此例引用了3次,函数内部引用了两次,b赋值引用1次)
sys.argv #获取执行脚本时,传入的参数[脚本文件路径,传入的第一个参数,传入的第二个参数]
sys.argv[1] #就是用户传入的第一个参数
sys.path #系统路径
sys.stdout.write #-->print (进度)
sys.stdout.write('你好') #输出
6.1.3 shutil模块
shutil高级的文件、文件夹、压缩包 处理模块.
- shutil.rmtree() #删除目录
- shutil.move() #重命名
- shutil.make_archive() #压缩
- shutil.unpack_archive() #解压缩
file_path=r'zipdir\x.txt'
#删除和重命名
import shutil
#删除目录及文件.
shutil.rmtree('zipdir.tar.tar')
#重命名
shutil.move('1.txt','file1.txt')
#压缩文件 压缩后的文件名,压缩格式,被压缩文件目录
# shutil.make_archive('base_name','format','dirname')
shutil.make_archive('zipdir.tar','tar','zipdir')
#解压
# shutil.unpack_archive('filename',format='',extract_dir='')
shutil.unpack_archive('zipdir.tar.tar',format='tar',extract_dir='logs')
6.1.4 hashlib模块
MD5的全称是Message-Digest Algorithm 5(信息-摘要算法),在90年代初由MIT Laboratory for Computer Science和RSA Data Security Inc的Ronald L. Rivest开发出来,经MD2、MD3和MD4发展而来。
hashlib的功能MD5将指定的字符串进行加密,加密前需要将字符串转换为2进制,再讲加密后的内容转换为十进制显示.
- MD5格式
import hashlib
obj=hashlib.md5()
obj.update('date'.encode('utf-8')) #uncode转成压缩后的二进制
result=obj.hexdigest() #转成十进制
print(result)
-
加盐
为了增加难度,给原有密文进行固定字符串的加强,加盐后,字符串会和需要加密的内容一起进行md5计算,加盐的字符串越长月负责,黑客在用字典对比密码的时候花费的时间就越长。
obj=hashlib.md5('fueufu193'.encode('utf-8')) #加盐'fueufu193'
-
md5应用
将md5加密写成一个函数共以后调用
def get_md5(data):
#md5加密
obj=hashlib.md5('fueufu193'.encode('utf-8')) #加盐'fueufu193'
obj.update(data.encode('utf-8')) #uncode转成压缩后的二进制
result=obj.hexdigest() #转成十进制
return result
print(get_md5('123.com'))
6.1.5 getpass模块
-
getpass格式
getpass主要应用在用户输入密码时隐藏输入内容。
import getpass
pwd=getpass.getpass('请输入密码:')
print (pwd)
6.1.6 random模块
random() 方法返回随机生成的一个实数,它在(0,1)范围内。random()是不能直接访问的,需要导入 random 模块,然后通过 random 静态对象调用该方法。
- random格式
import random
random.random() #产生0 到 1 之间的随机浮点数
# 0.4235090935967636
- random常用方法
print( random.randint(1,10) ) # 产生 1 到 10 的一个整数型随机数
print( random.random() ) # 产生 0 到 1 之间的随机浮点数
print( random.uniform(1.1,5.4) ) # 产生 1.1 到 5.4 之间的随机浮点数,区间可以不是整数
print( random.choice('tomorrow') ) # 从序列中随机选取一个元素
print( random.randrange(1,10,2) ) # 生成从1到10的间隔为2的随机整数
# 多个字符中选取指定数量的字符组成新字符串:
print( ''.join(random.sample(['z','y','x','w','v','u','t','s','r','q'], 5)))
a=[1,3,5,6,7] # 将列表a中的元素顺序打乱
random.shuffle(a)
print(a)
6.1.7 time模块
- time模块格式
- time.sleep() #延迟执行单位秒
- time.time() #返回当前时间的时间戳(1970纪元后经过的浮点秒数)。
- time.timezone #获取当前时区和格林威治(0时区)时区的间隔时间(单位是秒),向东是负数,向西是正数
- time.strftime() #方法语法
import time
v1=time.time()
print(v1)
# 1564388944.3761902
v2=time.timezone
print(v2)
# -28800
v3=time.ctime()
print(v3)
# Mon Jul 29 16:31:27 2019
v4=time.altzone
print(v4)
# -32400
v=time.strptime('2011-11-12','%Y-%m-%d')
print(v)
# time.struct_time(tm_year=2011, tm_mon=11, tm_mday=12, tm_hour=0, tm_min=0, tm_sec=0, tm_wday=5, tm_yday=316, tm_isdst=-1)
Python time strftime() 函数接收以时间元组,并返回以可读字符串表示的当地时间,格式由参数format决定。
time.strftime(format[, t])
# 参数说明:
format -- 格式字符串。
t -- 可选的参数t是一个struct_time对象
python中时间日期格式化符号:
%y 两位数的年份表示(00-99)
%Y 四位数的年份表示(000-9999)
%m 月份(01-12)
%d 月内中的一天(0-31)
%H 24小时制小时数(0-23)
%I 12小时制小时数(01-12)
%M 分钟数(00=59)
%S 秒(00-59)
%a 本地简化星期名称
%A 本地完整星期名称
%b 本地简化的月份名称
%B 本地完整的月份名称
%c 本地相应的日期表示和时间表示
%j 年内的一天(001-366)
%p 本地A.M.或P.M.的等价符
%U 一年中的星期数(00-53)星期天为星期的开始
%w 星期(0-6),星期天为星期的开始
%W 一年中的星期数(00-53)星期一为星期的开始
%x 本地相应的日期表示
%X 本地相应的时间表示
%Z 当前时区的名称
%% %号本身
6.1.8 datetime模块
datetime的的主要用途是在编程过程中对时间的操作,例如用户输入时间,代码对时间进行操作,输入的时间为字符串,datetime不能直接对字符串进行操作,需要将str类型的对象转换为datatime类型,等时间处理结束后再将datetime转换为str。
-
datetime数据类型:
datetime.datetime.
-
格式:
import datetime / form datetime import datetime
下面介绍time datatime str之间的转换及datetime 的加减运算。
import time
from datetime import datetime,timezone,timedelta
# ###########获取datetiem格式的时间 ###############
v1=datetime.now()
#当前本地时间
print(v1)
tz=timezone(timedelta(hours=-8))
print(tz)
#UTC-08:00
v2=datetime.now(tz)
print(v2)
#2020-07-28 21:40:33.247303-08:00
#当前UTC时间
v3=datetime.utcnow()
print(v3)
# ####### 把datetime格式转换为字符串 strftime ###########
v4=datetime.now()
print(v4,type(v4))
#<class 'datetime.datetime'>
val=v4.strftime("%Y-%m-%d_%H:%M:%S")
print(val)
#2022-07-29_13:46:51
# ############# 把字符串转换为datetime格式 strptime ################
v5="2022-07-29 05:46:51"
v6=datetime.strptime(v5,'%Y-%m-%d %H:%M:%S')
print(v6,type(v6))
#2022-07-29 05:46:51 <class 'datetime.datetime'>
# ############## datetime时间加减法(datetime格式的时间) ##################
ctime=datetime.strptime("2022-11-09",'%Y-%m-%d')
#字符串转换为datetime格式
print(ctime,type(ctime))
v7=v6 + timedelta(days=300,hours=23)
print(v7,type(v7))
#2023-05-26 04:46:51 <class 'datetime.datetime'>
v8=v7.strftime('%Y-%m-%d_%H:%M:%S')
print(v8,type(v8))
#2023-05-26_04:46:51 <class 'str'>
# ############ 时间戳和datetime的关系 ###############
# datetime.fromtimestamp() #floatz转换为datetime
# x.timestamp() #datetime转换为float
v9=time.time()
print(v9)
# 1564383477.6582062
v10=datetime.fromtimestamp(v9)
print(v10,type(v10))
#2019-07-29 14:57:57.658206 <class 'datetime.datetime'>
v11=datetime.now()
v12=v11.timestamp()
print(v11,type(v11),v12,type(v12))
# 2019-07-29 14:57:57.658206 <class 'datetime.datetime'> 1564383477.658206 <class 'float'>
6.1.9 序列化 json & pickle
json模块和pickle模块
-
json,传输的是字符串(str)优点:所有语言通用;缺点:只能系列化基本的数据类型 list/dict/int...
-
pickle,传输的是字节(bytes)优点:python中什么都可以序列化 缺点:序列化后的数据只有python能识别。夸语言平台差
-
json,全名 JavaScript Object Notation,是一种轻量级的数据交换格式。Json最广泛的应用是作为AJAX中web服务器和客户端的通讯的数据格式。现在也常用于http请求中。
-
json是一个特殊的字符串(有点像列表中、字典、数字、布尔值组合而成的),程序和程序之间交互需要用到json。
- 把一个数据转换为json格式----序列化
- 把json格式的数据转换为列表元组字典等格式----反序列化
-
json格式要求
- 最外层必须是个容器类型(列表)
- 在json中如果包含字符串,必须是双引号(“abc”)【单引号,只有python能识别,其他语言不能识别】
-
json格式转换
-
序列化和反序列化
- json.dumps() #序列化
- json.loads() #反序列化
# 案例1. v1=[12,21,"alice",{"k1":"v1"},True,('12','中文')] import json #序列化:将python格式的数值转换为json格式的字符串 v2=json.dumps(v1) print(v2,type(v2)) # [12, 21, "alice", {"k1": "v1"}, true, ["12", "\u4e2d\u6587"]] <class 'str'> #反序列化:将json格式的数值转换为python格式的字符串 v3=json.loads(v2) print(v3,type(v3)) # [12, 21, 'alice', {'k1': 'v1'}, True, ['12', '中文']] <class 'list'> # 因为有单引号总是报错 # v7="[12, 21, 'alice', {'k1': 'v1'}, True, 'hello world!']" # print(json.loads(v7)) -
序列化和反序列化存储
- json.dump() #
- json.load() #
import json data=[1,{'k1':'M1','K2':'M2'},('LIFT','IS','COOL'),'&&','^%&*(中国)'] with open('1.txt','w',encoding='utf-8') as f: json.dump(data,f) #(数据,文件) with open('1.txt','r',encoding='utf-8') as f: v1=json.load(f) #加载json文件 print(v1,type(v1)) [1,{'k1': 'M1', 'K2': 'M2'}, ['LIFT', 'IS', 'COOL'], '&&', '^%&*(中国)'] <class 'list'> -
json.dumps(filename,ensure_ascii=False) #加入ensure_ascii=False就会取消中文转译unicode
注意事项:
json序列化中文
import json val1={'k1':'二代','k2':'sang'} v11=json.dumps(val1) print(v11) #{"k1": "\u4e8c\u4ee3", "k2": "sang"} ,其中的中文会转译成unicode v12=json.dumps(val1,ensure_ascii=False) print(v12) #{"k1": "二代", "k2": "sang"} ,加入ensure_ascii=False就会取消转译 -
-
python格式转换为json后的数据类型
1.dict ---- object
2.list,tuple - ---array(数组)
3.str ---- string
4.int,flort ---- number
5.True ---- true
6.False ---- false
7.None ---- null -
pickle序列化功能强大几乎可以序列化所有类型的数据,但职能应用在python中。
加载:import pickle
格式:
- pickle.dumps() #序列化
- pickle.loads() #反序列化
- pickle.load(data,filename) #序列化到文件
- pickle.dump(data,filename) #加载文件并反序列化
示例:
import pickle
# pickle.dumps() 序列化
# pickle.loads() 反序列化
v={1,2,3,4,5}
v1=pickle.dumps(v)
print(v1,type(v1))
# b'\x80\x03cbuiltins\nset\nq\x00]q\x01(K\x01K\x02K\x03K\x04K\x05e\x85q\x02Rq\x03.' <class 'bytes'>
v2=pickle.loads(v1)
print(v2,type(v2))
# {1, 2, 3, 4, 5} <class 'set'>
# pickle.load(data,filename)
# pickle.dump(data,filename)
data="我爱你中国!"
with open('1.txt','wb') as filename:
pickle.dump(data,filename)
with open('1.txt','rb') as filename:
v1=pickle.load(filename)
print(v1,type(v1))
# 我爱你中国! <class 'str'>
6.1.10 logging模块
未完待续.......
6.2 第三方模块
-
pip ---py.pip.org(包管理地址)
python36 -m pip install --upgrade pip #安装或者更新pip
pip install pdf2 安装pdf2模块
xlrd模块(打印excel文件)
6.3 自定义模块
- import 自动以.py;
- 调用方式:自定义.函数名()
6.3.1 模块定义
-
定义文件类型 package_name/model_name.py
def func_name1:
print("func_name1")
def func_name2:
print("func_name2") -
定义包类型 package_name/model_name.py
__init__.py model_name.py
6.3.2模块调用
- 导入:
- import model_name #导入模块
- from model_name import func_name1,func_name2 #导入模块中的个别功能
- from model_name import * #导入所有功能
- 4.from model_name import func_name1,func_name2 as fname1,fname2 #函数别名
- import package_name.model_name
- from package_name.model_name import func_name2 as fname1
- 调用:
- model_name.func_name()
- func_name1()
- func_name1()
- fname1()
- package_name.model_name.func_name()
- fname1()
注意事项:
模块可以是py文件也可以是包(通俗就是文件夹),import package.model_name.py
定义包形式的模块:py2中必须有__init__.py文件标识,py3不需要(推荐不论是py2 or py3都加上__init__.py)

浙公网安备 33010602011771号