模块与包
模块
模块介绍
在Python中,一个py文件就是一个模块。模块名则是这个py文件的文件名。
模块的优点
- 提高开发效率。
模块的来源
- 内置的:python解释器自带的,直接拿来使用的
- 第三方的:别人写的,如果想用,就要先下载在使用 pip install 包名
- 自定义的:我们自己写的
模块的分类
1、使用纯Python代码编写的py文件
2、包含一系列模块的包
3、使用C编写并链接到Python解释器中的内置模块
4、使用C或C++编译的扩展模块
模块的搜索路径
1、如果该模块已加载到内存中,则直接引用
2、从左到右的顺序依次检索 sys.path
中定义的路径
import模块
- import 直接导入,但不能将里面的参数导出来。
import py文件名/模块名
- 用import语句导入多个模块
import app1
import app2
...
import appN
import app1,app2,...,appN
- 详细导入 from ... import ... 语句
from 模块位置 import 模块名
- 导入所有 from ... import * 语句
from model import *
- 模块重命名 from ... import ... as ... 语句
from 模块位置 import 模块名 as 自定义名字
os模块
import os
获取当前文件路径
- abspath
path = os.path.abspath(__file__)
print(path)
# F:\python项目\untitled\模块\1.py
获取当前文件所在文件夹的路径
- dirname 可以套多个返回上级
path = os.path.dirname(__file__)
print(path) # F:/python项目/untitled/模块
path1 = os.path.dirname(path)
print(path1) # F:/python项目/untitled
- getcwd
print(os.getcwd())
# F:\python项目\untitled\模块
判断当前路径是否存在
- exists
file_path = r'E:\Python'
print(os.path.exists(file_path))
# False
拼接路径
- join 可以拼多个
path = os.path.abspath(__file__)
print(os.path.join(path,'a.py'))
# F:\python项目\untitled\a.py
print(os.path.join(path,'5','a.py'))
# F:\python项目\untitled\5\a.py
切割路径
- split
path = os.path.abspath(__file__)
print(os.path.split(path))
# ('F:\\python项目\\untitled', '1.py')
当前路径是否是文件
- isfile
path1 = os.path.abspath(__file__)
print(os.path.isfile(path1))
# True
path2 = os.path.dirname(__file__)
print(os.path.isfile(path2))
# False
当前路径是否为绝对路径
- isabs
file_path1 = r'D:\Python\app.py'
file_path2 = r'../app.py'
print(os.path.isabs(file_path1))
# True
print(os.path.isabs(file_path2))
# False
获取当前文件或目录的最后访问时间
- getatime
import os, time
path = os.path.dirname(__file__)
file_path = os.path.abspath(__file__)
a = os.path.getatime(path)
print(a) # 1702543613.531708
print(time.strftime("%Y-%m-%d %H-%M-%S", time.localtime(a)))
# 2023-12-14 16-46-53
b = os.path.getatime(file_path)
print(time.strftime("%Y-%m-%d %H-%M-%S", time.localtime(b)))
# 2023-12-14 16-46-53
获取当前文件或者目录的创建时间
- getctime
import os, time
path = os.path.dirname(__file__)
file_path = os.path.abspath(__file__)
a=os.path.getctime(path)
print(a) # 1702256106.10977
print(time.strftime("%Y-%m-%d %H-%M-%S", time.localtime(a)))
# 2023-12-11 08-55-06
b = os.path.getctime(file_path)
print(time.strftime("%Y-%m-%d %H-%M-%S", time.localtime(b)))
# 2023-12-11 19-09-21
更多函数
函数 | 作用 |
---|---|
mkdir | 创建单级文件夹(只能创建单级文件目录,多级就会报错) |
makedirs | 创建多级文件夹 |
rmdir | 删除单级文件夹(若目录不为空则无法删除,报错) |
removedirs | 删除多级文件夹(若目录不为空则无法删除,报错) |
listdir | 列出当前文件夹下的所有文件及文件夹 |
remove | 删除指定文件 |
rename | 重命名文件夹/文件 |
stat | 获取文件夹/文件详细信息 |
chdir | 改变当前工作目录 |
random模块
import random
随机小数
- 默认区间的小数(random) 大于0且小于1之间的小数
res = random.random()
print(res)
# 0.16954696713473794
- 指定区间的小数(uniform)
# 指定为 0 到 5 之间的随机小数
res = random.uniform(1, 5)
print(res)
# 1.349527002017219
随机整数
- 随机区间整数(randint) 大于等于1且小于等于5之间的整数
# 大于等于1且小于等于5之间的整数
res = random.randint(1, 5)
print(res)
# 5
- 随机区间奇偶数(randrange) 大于等于1且小于10之间的奇数
import random
# 随机区间奇数 (开始,结束,步长)
res_one = random.randrange(1, 10, 2)
print(res_one)
# 5
随机选择返回
- 随机返回一个(choice) 随机选择一个返回
choice = ["tom", 'cad', 'zhans']
res = random.choice(choice)
print(res)
# cad
- 随机指定个数(sample) 指定待选择项和返回的个数
choice = ["tom", 'cad', 'zhans']
# 待选择项,返回的个数 但不能超过指定对象的数量
res = random.sample(choice,2)
print(res)
# ['zhans', 'tom']
打乱列表顺序
- shuffle
item = [1, 3, 5, 7]
random.shuffle(item)
print(item)
# [3, 5, 1, 7]
random.shuffle(item)
print(item)
# [1, 3, 7, 5]
登录验证----四位验证码
import random
def get_codes():
code=''
for i in range(4):
a=random.randint(0,9)
b=chr(random.randint(97,122))
c=chr(random.randint(65,90))
res = random.choice([a,b,c])
code=code+str(res)
# 生成随机四位验证码
return code
def login():
code=get_codes()
print(code)
aa=input('输入验证码:').strip()
if aa!=code:
return False,'错误'
else:
return True,'验证正确'
print(login())
# 3L19
# 输入验证码:3L19
# (True, '验证正确')
json模块
import json
反序列化(dumps)
- 将Python对象转换为json字符串
- json转换完的字符串类型的字典中的字符串是由 ""表示的
obj = {'name':'tom'}
json_obj = json.dumps(obj)
print(json_obj, type(json_obj))
# {"name": "tom"} <class 'str'>
序列化方法(loads)
- 将json字符串转换为Python对象
json_str = json.dumps(json_obj)
print(json_str, type(json_str))
# "{\"name\": \"tom\"}" <class 'str'>
不指定参数
- 接收一个文件句柄
- 直接将字典转换成 json字符串写入文件
obj = {'name':'tom'}
with open("data1.json", "w") as f:
json.dump(obj,f)
obj = {'name':'张三'}
with open("data2.json", "w") as f:
json.dump(obj,f)
data1.json
{"name": "tom"}
data2.json
带中文
{"name": "\u5f20\u4e09"}
指定参数编码(ensure_ascii)
obj = {'name':'张三'}
with open("data.json", "w",encoding='utf-8') as f:
json.dump(obj,f,ensure_ascii=False)
# ensure_ascii=False 上面指定编码格式后需要将 默认使用 ascii 这个选项设置为否
data.json
obj = {'name':'张三'}
指定参数分隔符(separators)
obj = {'name':'张三','age': 22}
with open("data.json", "w",encoding='utf-8') as f:
json.dump(obj, f,ensure_ascii=False, separators=(',', '*'))
data.json
{"name"*"张三","age"*22}
读文件数据(load)
- 直接将文件中的 json转换成数据结构返回
with open("data.json", "r",encoding='utf-8') as f:
python_obj = json.load(f)
print(python_obj, type(python_obj))
# {'name': '张三', 'age': 22} <class 'dict'>
hashlib模块
import hashlib
摘要算法 : 摘要算法又称哈希算法、散列算法。它通过一个函数,把任意长度的数据转换为一个长度固定的数据串(通常用16进制的字符串表示)。摘要算法加密的特点是:相同的数据加密出来的加密串是一样的。
a='you i as dog'.encode('utf-8')
md5=hashlib.md5(a)
# 十六进制
print(md5.hexdigest()) #089cd9b11feb94aa59c8adf2f6c7edc6
# 二进制
print(md5.digest()) # b'\x08\x9c\xd9\xb1\x1f\xeb\x94\xaaY\xc8\xad\xf2\xf6\xc7\xed\xc6'
密码加密
data={}
def save_data(path,data,mode='a',encoding='utf-8'):
with open(path,mode=mode,encoding=encoding) as f:
json.dump(data,f)
def encry_password(data):
md5 = hashlib.md5(data.encode('utf-8'))
return md5.hexdigest()
def register():
username=input('用户名:').strip()
password = input('密码:').strip()
password=encry_password(password)
data[username]={
'username':username,
'password':password,
}
save_data(path='data.json',data=data)
register()
data.json
{"qcc": {"username": "qcc", "password": "202cb962ac59075b964b07152d234b70"}}
包
什么是包
- 在Python中,包是模块的集合体。包内部必须包含一个特殊的
__init__.py
文件,它可以为空文件或包含初始化代码。