一、自定义模块
1. 包和模块
模块:
定义:包含一系列数据,函数,类的文件,通常以.py结尾作用:让一些相关的数据,函数,类有逻辑的组织在一起,使逻辑结构更加清晰。
包:
概念:集合了一组py文件, 提供了一组复杂的功能
1.包 是一个 包含多个模块 的 特殊目录.
2.目录下有一个 特殊的文件 __init__.py
3.包名的 命名方式 和变量名一致,小写字母 + _
2. 导入
2.1 导入路径
在Python内部默认设置了一些路径,导入模块或包时,都会按照指定顺序逐一去特定的路径查找。 import sys print(sys.path)
[
'当前执行脚本所在的目录', 'D:', '/Applications/PyCharm.app/Contents/plugins/python/helpers/pycharm_display', '/Library/Frameworks/Python.framework/Versions/3.9/lib/python39.zip', '/Library/Frameworks/Python.framework/Versions/3.9/lib/python3.9', '/Library/Frameworks/Python.framework/Versions/3.9/lib/python3.9/lib-dynload', '/Library/Frameworks/Python.framework/Versions/3.9/lib/python3.9/site-packages', '/Applications/PyCharm.app/Contents/plugins/python/helpers/pycharm_matplotlib_backend'
]
- 在写模块名称时,不能与内置与第三方同名
- 项目执行文件一般都在根目录,如果执行文件嵌套在内层目录,就需要通过sys.path,append手动添加到路径
import os import sys sys.path.append(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
通过
os
和sys
模块,获取当前脚本文件(__file__
代表当前脚本路径 )的绝对路径,然后向上找两级目录,将该目录路径添加到 Python 模块搜索路径(sys.path
)中,方便导入该目录下的自定义模块 。
2.2 import与form...import..导入
导入方式 | 示例 | 调用方式 | 优点 | 缺点 |
---|---|---|---|---|
import 模块名 | import math | math.sqrt() | 避免命名冲突,代码来源清晰 | 代码较长 |
from 模块名 import 成员 | from math import sqrt | sqrt() | 代码简洁 | 可能引发命名冲突 |
from 模块名 import * | from math import * | sqrt() | 代码极为简洁 | 容易导致命名冲突,降低代码可读性 |
2.3 相对导入
相对导入是基于当前模块的位置,使用 .
(当前包)和 ..
(父包)来定位其他模块。只有在包内部的模块中才能使用相对导入,直接运行的脚本(作为主程序执行的文件)不能使用相对导入。
from . import 模块名
from .. import 模块名
2.4 导入别名
import 模块名 as 别名
import numpy as np
2.5 主文件
- 执行一个py文件时
__name__ = "__main__"
-
导入一个py文件时
__name__ = 模块名
通过__name__来确定主程序,主文件就是程序执行的文件入口。
if __name__ = "__main__":
二、第三方模块
Python内部提供的模块有限,所以在平时在开发的过程中,经常会使用第三方块。
而第三方模块必须要先安装才能可以使用,下面介绍常见的3中安装第三方模块的方式。
1. pip(最常用)
这是Python中最最最常用的安装第三方模块的方式。
Pip其实是一个第三方模块包管理工具,默认安装Pvthon解释器时自动会安装,
默认目录:
MAC系统,即:Python安装路径的bin目录下
/Library/Frameworks/Python.framework/Versions/3.9/bin/pip3/Library/Frameworks/Python.framework/Versions/3.9/bin/pip3.9
Windows系统,即:Python安装路径的脚本目录下
C:\Python39\scriptslpip3.exe
C:Python39\scripts\pip3.9.exe
安装第三方模块,终端执行:
pip install 模块名
默认安装最新版本,如果要指定版本,在模块后加 == 指定版本
pip install django==2.0
pip默认是去http://pypi.org去下载第三方模块,国外网站下载速度慢,可以指定安装源:(通常使用豆瓣源)来加快下载速度:
pip install 模块名 -i https://pypi.douban.com/simple/
其他源可供选择:
阿里云:http://mirrors.aliyun.com/pypi/simple/
中国科技大学:https://pypi.mirrors.ustc.edu.cn/simple/
清华大学:https://pypi.tuna.tsinghua.edu.cn/simple/
中国科学技术大学:http://pypi.mirrors.ustc.edu.cn/simple/
2. 基于源码安装
如果要安装的模块在pypi.org中不存在 或 因特殊原因无法通过pip instal 安装时,可以直接下载源码,然后基于源码安装,例如:
下载requests源码(压缩包zip、tar、tar.gz)并解压。
下载地址:https://pypi.org/project/requests/#files
进入目录,终端执行命令
# 编译
python setup.py build
# 安装
python setup.py install
三、内置模块
python常用内置模块汇总
3.1 OS
import os
import shutil
def get_abs_path():
"""
1. 获取当前脚本绝对路径
"""
abs_path = os.path.abspath(__file__)
print(f"1. 当前脚本绝对路径: {abs_path}")
return abs_path
def get_base_path(abs_path):
"""
2. 获取当前文件的上级目录(基于传入的绝对路径)
"""
base_path = os.path.dirname(os.path.dirname(abs_path))
print(f"2. 上级目录: {base_path}")
return base_path
def path_join_demo(base_path):
"""
3. 路径拼接演示
"""
p1 = os.path.join(base_path, 'xx')
p2 = os.path.join(base_path, 'xx', 'oo', 'a1.png')
print(f"3. 拼接路径1: {p1}")
print(f"3. 拼接路径2: {p2}")
return p1, p2
def check_path_exists(path):
"""
4. 判断路径是否存在
"""
exists = os.path.exists(path)
print(f"4. 路径 '{path}' 是否存在: {exists}")
return exists
def create_dir_demo(base_path):
"""
5. 创建文件夹演示
"""
path = os.path.join(base_path, 'xx', 'oo', 'uuuu')
if not os.path.exists(path):
os.makedirs(path)
print(f"5. 已创建文件夹: {path}")
else:
print(f"5. 文件夹 {path} 已存在")
return path
def check_is_dir_demo(base_path):
"""
6. 判断是否是文件夹演示
"""
file_path = os.path.join(base_path, 'xx', 'oo', 'a1.png')
folder_path = os.path.join(base_path, 'xx', 'oo', 'uuuu')
is_file_dir = os.path.isdir(file_path)
is_folder_dir = os.path.isdir(folder_path)
print(f"6. 文件路径 '{file_path}' 是否是文件夹: {is_file_dir}")
print(f"6. 文件夹路径 '{folder_path}' 是否是文件夹: {is_folder_dir}")
return is_file_dir, is_folder_dir
def delete_file_or_folder(base_path):
"""
7. 删除文件或文件夹演示
"""
# 创建测试文件
test_file = os.path.join(base_path, 'test.txt')
with open(test_file, 'w') as f:
f.write('测试内容')
print(f"7. 已创建测试文件: {test_file}")
# 删除文件
os.remove(test_file)
print(f"7. 已删除文件: {test_file}")
# 删除文件夹(需要先创建)
test_dir = os.path.join(base_path, 'test_dir')
os.makedirs(test_dir, exist_ok=True)
print(f"7. 已创建测试文件夹: {test_dir}")
# 删除文件夹(递归删除)
shutil.rmtree(test_dir)
print(f"7. 已删除文件夹: {test_dir}")
def get_list(path):
"""
# 查看目录下的所有文件
"""
data = os.listdir(path)
print(data) # 打印出当前路径下文件夹下所有文件
3.2 shutil
import os
import shutil
# --- 删除操作 ---
def delete_dir(path):
"""删除文件夹(若存在)"""
if os.path.exists(path):
shutil.rmtree(path)
print(f" 已删除: {path}")
else:
print(f"文件夹不存在: {path}")
# --- 复制操作 ---
def copy_dir(src, dst):
"""复制文件夹"""
try:
shutil.copytree(src, dst)
print(f"已复制文件夹: {src} → {dst}")
except FileExistsError:
print(f"目标已存在: {dst}")
def copy_file(src, dst):
"""复制文件(自动处理文件/文件夹目标)"""
shutil.copy(src, dst)
print(f"已复制文件: {src} → {dst}")
# --- 重命名/移动操作 ---
def move(src, dst):
"""移动/重命名文件或文件夹"""
shutil.move(src, dst)
print(f" 已移动: {src} → {dst}")
# --- 压缩操作 ---
def compress(src_dir, output_base, format='zip'):
"""压缩文件夹"""
path = shutil.make_archive(output_base, format, src_dir)
print(f"已压缩: {src_dir} → {path}")
return path
# --- 解压操作 ---
def extract(archive_path, dest_dir=None):
"""解压文件(自动检测格式)"""
if dest_dir is None:
dest_dir = os.path.splitext(archive_path)[0]
shutil.unpack_archive(archive_path, dest_dir)
print(f" 已解压: {archive_path} → {dest_dir}")
3.3 sys
# 导入模块路径
import sys
print(sys.path)
3.4 random
import random
# 1. 获取范围内的随机整数
v = random.randint(10, 20)
print(v)
# 2. 获取范围内的随机小数
v = random.uniform(1, 10)
print(v)
# 3. 随机抽取一个元素
v = random.choice([11, 22, 33, 44, 55])
print(v)
# 4. 随机抽取多个元素
v = random.sample([11, 22, 33, 44, 55], 3)
print(v)
# 5. 打乱顺序
data = [1, 2, 3, 4, 5, 6, 7, 8, 9]
random.shuffle(data)
print(data)