Python模块和包


在 Python 中,模块(Module)包(Package) 是组织代码的核心机制,用于实现代码复用、模块化管理和避免命名冲突。尤其在大型项目中,合理使用模块和包能显著提升代码的可维护性。

一、模块(Module):单个 Python 文件

模块是一个以 .py 为扩展名的 Python 文件,包含函数、类、变量和可执行代码。简单来说:一个 .py 文件 = 一个模块

1. 模块的作用

  • 代码复用:将常用功能(如工具函数、类)封装到模块中,其他程序可直接导入使用,无需重复编写。
  • 模块化管理:将复杂程序拆分为多个模块,每个模块负责单一功能,逻辑更清晰。
  • 避免命名冲突:不同模块中可存在同名函数/变量,通过“模块名.成员”的方式访问,避免冲突。

2. 创建模块

创建一个文本文件,命名为 my_module.py(文件名即模块名),写入以下内容:

# my_module.py
# 变量
version = "1.0"

# 函数
def add(a, b):
    return a + b

def multiply(a, b):
    return a * b

# 类
class Calculator:
    def divide(self, a, b):
        if b == 0:
            return "除数不能为0"
        return a / b

这就是一个简单的模块,包含变量、函数和类。

3. 导入模块

使用 import 语句导入模块,然后通过“模块名.成员”的方式使用模块中的内容。常用导入方式有以下几种:

(1)导入整个模块
import my_module  # 导入模块

# 使用模块中的成员(变量、函数、类)
print(my_module.version)  # 访问变量 → "1.0"
print(my_module.add(2, 3))  # 调用函数 → 5

calc = my_module.Calculator()  # 创建类实例
print(calc.divide(6, 2))  # 调用类方法 → 3.0
(2)导入模块并指定别名(简化调用)

as 给模块起别名,适合模块名较长的场景:

import my_module as mm  # 别名 mm

print(mm.multiply(3, 4))  # 4 → 12
(3)导入模块中的特定成员

from ... import 直接导入模块中的变量、函数或类,可直接使用(无需加模块名):

from my_module import add, Calculator  # 只导入 add 函数和 Calculator 类

print(add(5, 5))  # 直接调用 → 10
calc = Calculator()
print(calc.divide(10, 5))  # → 2.0
(4)导入模块中的所有成员(不推荐)

from ... import * 导入模块中所有公开成员(不建议,可能导致命名冲突):

from my_module import *  # 导入所有公开成员

print(version)  # 直接使用变量 → "1.0"
print(multiply(2, 5))  # → 10

4. 模块的执行控制(__name__ 变量)

模块中的代码既可以被导入,也可以直接运行(如作为脚本)。__name__ 变量用于区分这两种场景:

  • 当模块被导入时,__name__ 的值为模块名(如 my_module)。
  • 当模块直接运行时,__name__ 的值为__main__

在模块中添加执行控制代码,可让模块既作为工具被导入,又能作为脚本独立运行:

# my_module.py(补充执行控制)
...  # 原有变量、函数、类

if __name__ == "__main__":
    # 只有当模块直接运行时,才执行以下代码
    print("模块直接运行时的测试:")
    print(add(1, 1))  # 2
    calc = Calculator()
    print(calc.divide(4, 2))  # 2.0
  • 当直接运行 python my_module.py 时,会执行 if 块内的测试代码。
  • 当被其他模块导入时,if 块内的代码不会执行。

二、包(Package):模块的集合

是一个包含多个模块的目录,且目录中必须有一个 __init__.py 文件(用于标识该目录是 Python 包)。

简单来说:一个带 __init__.py 的目录 = 一个包,用于组织多个相关模块。

1. 包的结构

一个典型的包结构如下(以 my_package 为例):

my_package/          # 包目录
├── __init__.py      # 包的初始化文件必需
├── module1.py       # 模块1
├── module2.py       # 模块2
└── subpackage/      # 子包嵌套包
    ├── __init__.py
    └── module3.py   # 子包中的模块

2. __init__.py 文件的作用

__init__.py 是包的标识文件,可为空,也可包含代码(用于控制包的导入行为):

  • 标识作用:告诉 Python 该目录是一个包,否则会被视为普通目录。
  • 初始化作用:包被导入时,会自动执行 __init__.py 中的代码(如定义包的公开接口)。
  • 控制导入:通过 __all__ 变量指定 from package import * 时可导入的模块(见下文)。

3. 创建包示例

按上述结构创建包: - my_package/module1.py

def func1():
    return "这是 module1 的 func1"
  • my_package/module2.py
def func2():
  return "这是 module2 的 func2"
  • my_package/__init__.py(为空,或添加 __all__):
# 定义 from my_package import * 时可导入的模块
__all__ = ["module1", "module2"]  # 仅对 * 导入有效

4. 导入包中的模块

导入包中模块的方式与导入普通模块类似,需指定包的路径:

(1)导入包中的模块
# 导入 my_package 中的 module1
import my_package.module1

print(my_package.module1.func1())  # → "这是 module1 的 func1"
(2)导入包中的模块并指定别名
import my_package.module2 as m2

print(m2.func2())  # → "这是 module2 的 func2"
(3)从包中导入模块中的成员
from my_package.module1 import func1

print(func1())  # → "这是 module1 的 func1"
(4)从包中导入模块(简化路径)
from my_package import module2

print(module2.func2())  # → "这是 module2 的 func2"
(5)导入包中的所有模块(依赖 __init__.py__all__
from my_package import *  # 导入 __all__ 中指定的模块

print(module1.func1())  # → "这是 module1 的 func1"
print(module2.func2())  # → "这是 module2 的 func2"
(6)导入子包中的模块
# 导入子包 subpackage 中的 module3
from my_package.subpackage import module3

# 假设 module3 中有 func3
print(module3.func3())

三、模块的搜索路径

当导入模块时,Python 会按以下顺序在搜索路径中查找模块文件: 1. 当前执行脚本所在的目录(优先)。 2. 系统环境变量 PYTHONPATH 中指定的目录。 3. Python 安装目录中的标准库目录(如 site-packages)。

可通过 sys.path 查看当前搜索路径:

import sys
print(sys.path)  # 列表形式,包含所有搜索路径

若自定义模块不在搜索路径中,可临时添加路径:

import sys
sys.path.append("/path/to/your/module/directory")  # 添加自定义目录
import my_module  # 此时可导入该目录下的模块

四、常用模块类型

1.内置模块:Python 自带的模块(无需安装,直接导入),如 os(文件操作)、sys(系统交互)、math(数学运算)、datetime(时间处理)等。

import math
print(math.sqrt(16))  # → 4.0(计算平方根)

2.第三方模块:由社区开发的模块(需用 pip 安装),如 requests(网络请求)、pandas(数据分析)等。

  • 安装:pip install requests
  • 使用:import requests

  • 自定义模块/包:开发者根据需求自己编写的模块或包(如前文的 my_modulemy_package)。

Python常用自带模块

Python 标准库包含大量实用模块,无需额外安装即可使用。以下是最常用的自带模块教程,涵盖核心功能与实用示例: 使用时直接 import 模块名 即可,无需额外安装。如需深入,可通过 help(模块名) 查看完整文档。

一、os 模块:与操作系统交互

功能:处理文件/目录、获取系统信息、执行系统命令等。

常用函数:

  • os.getcwd():获取当前工作目录
  • os.listdir(path):列出指定路径下的文件/目录
  • os.path:子模块,处理路径(跨平台兼容)
  • os.path.join(a, b):拼接路径(自动处理斜杠)
  • os.path.exists(path):判断路径是否存在
  • os.path.isfile(path):判断是否为文件
  • os.mkdir(path):创建单级目录
  • os.makedirs(path):创建多级目录(如 a/b/c

示例

import os

# 获取当前目录
print("当前目录:", os.getcwd())

# 拼接路径(跨平台,Windows 用 \,Linux 用 /)
path = os.path.join("data", "logs", "today.txt")
print("拼接路径:", path)

# 检查路径是否存在,不存在则创建
if not os.path.exists(os.path.dirname(path)):
    os.makedirs(os.path.dirname(path))  # 创建 data/logs 目录

# 列出当前目录内容
print("当前目录内容:", os.listdir("."))

二、sys 模块:与 Python 解释器交互

功能:获取命令行参数、控制解释器行为、退出程序等。

常用函数:

  • sys.argv:获取命令行参数(列表,sys.argv[0] 是脚本名)
  • sys.version:获取 Python 版本信息
  • sys.exit(code):退出程序(code=0 表示正常退出)
  • sys.path:Python 搜索模块的路径列表

示例

import sys

# 打印命令行参数(运行脚本时:python script.py arg1 arg2)
print("命令行参数:", sys.argv)  # 输出:['script.py', 'arg1', 'arg2']

# 打印 Python 版本
print("Python 版本:", sys.version.split()[0])  # 输出:3.10.6

# 若参数不足则退出
if len(sys.argv) < 2:
    print("请输入至少一个参数!")
    sys.exit(1)  # 非 0 表示异常退出

三、datetime 模块:处理日期与时间

功能:生成/解析日期时间、计算时间差、格式化时间等。

核心类:

  • datetime.datetime:日期+时间(如 2023-10-01 15:30:00
  • datetime.date:仅日期(如 2023-10-01
  • datetime.time:仅时间(如 15:30:00
  • datetime.timedelta:时间差(用于加减日期)

示例

from datetime import datetime, timedelta

# 获取当前时间
now = datetime.now()
print("当前时间:", now)  # 输出:2023-10-01 15:30:00.123456

# 格式化时间为字符串(常用指令:%Y=年,%m=月,%d=日,%H=时,%M=分,%S=秒)
formatted = now.strftime("%Y-%m-%d %H:%M:%S")
print("格式化时间:", formatted)  # 输出:2023-10-01 15:30:00

# 计算 3 天后的日期
future = now + timedelta(days=3)
print("3天后:", future.strftime("%Y-%m-%d"))  # 输出:2023-10-04

# 解析字符串为 datetime 对象
str_time = "2023-01-01 10:00:00"
parsed = datetime.strptime(str_time, "%Y-%m-%d %H:%M:%S")
print("解析后的时间:", parsed)

四、json 模块:处理 JSON 数据

功能:Python 对象与 JSON 字符串的相互转换(序列化/反序列化)。

常用函数:

  • json.dumps(obj):Python 对象 → JSON 字符串
  • json.loads(s):JSON 字符串 → Python 对象
  • json.dump(obj, file):Python 对象写入 JSON 文件
  • json.load(file):从 JSON 文件读取 → Python 对象

示例

import json

# Python 字典(可序列化类型:dict、list、str、int、float、bool、None)
data = {
    "name": "小明",
    "age": 18,
    "hobbies": ["篮球", "编程"],
    "is_student": True
}

# 序列化:Python → JSON 字符串
json_str = json.dumps(data, ensure_ascii=False, indent=2)  # ensure_ascii=False 保留中文
print("JSON 字符串:\n", json_str)

# 反序列化:JSON 字符串 → Python
python_obj = json.loads(json_str)
print("反序列化后:", python_obj["name"])  # 输出:小明

# 写入 JSON 文件
with open("data.json", "w", encoding="utf-8") as f:
    json.dump(data, f, ensure_ascii=False, indent=2)

# 读取 JSON 文件
with open("data.json", "r", encoding="utf-8") as f:
    loaded = json.load(f)
print("从文件读取:", loaded["hobbies"])  # 输出:['篮球', '编程']

五、re 模块:正则表达式

功能:字符串匹配、查找、替换、分割等(处理复杂文本)。

常用函数:

  • re.match(pattern, s):从字符串开头匹配(不匹配返回 None)
  • re.search(pattern, s):在整个字符串中找第一个匹配
  • re.findall(pattern, s):返回所有匹配的子串(列表)
  • re.sub(pattern, repl, s):替换匹配的子串

示例

import re

# 匹配邮箱(简单规则:xxx@xxx.xxx)
email_pattern = r'^[a-zA-Z0-9_-]+@[a-zA-Z0-9_-]+(\.[a-zA-Z0-9_-]+)+$'
emails = ["test@example.com", "invalid-email", "user.name+tag@domain.co"]

for email in emails:
    if re.match(email_pattern, email):
        print(f"{email} 是有效邮箱")
    else:
        print(f"{email} 是无效邮箱")

# 提取字符串中的所有数字
text = "今年 25 岁,月薪 15000 元,存款 500000"
numbers = re.findall(r'\d+', text)  # \d+ 匹配1个以上数字
print("提取的数字:", numbers)  # 输出:['25', '15000', '500000']

# 替换敏感词(用*代替)
sensitive = "垃圾、笨蛋"
text = "这人真是笨蛋,说的都是垃圾"
censored = re.sub(r'垃圾|笨蛋', '*', text)
print("过滤后:", censored)  # 输出:这人真是*,说的都是*

六、math 模块:数学运算

功能:提供基础数学函数(比内置运算符更丰富)。

常用函数:

  • math.pi:圆周率 π(≈3.14159)
  • math.sqrt(x):计算平方根
  • math.sin(x)/math.cos(x):三角函数(参数为弧度)
  • math.floor(x)/math.ceil(x):向下/向上取整
  • math.pow(x, y):计算 x 的 y 次方

示例

import math

# 计算圆的面积(半径 5)
r = 5
area = math.pi * math.pow(r, 2)
print(f"圆面积:{area:.2f}")  # 输出:78.54

# 平方根与取整
print("10的平方根:", math.sqrt(10))  # 输出:3.162...
print("3.7向下取整:", math.floor(3.7))  # 输出:3
print("2.1向上取整:", math.ceil(2.1))  # 输出:3

# 三角函数(30度转弧度:30°×π/180)
rad = 30 * math.pi / 180
print("sin(30°):", math.sin(rad))  # 输出:0.5

七、random 模块:生成随机数

功能:生成随机数、随机选择元素、打乱序列等。

常用函数:

  • random.random():生成 [0.0, 1.0) 之间的随机浮点数
  • random.randint(a, b):生成 [a, b] 之间的随机整数
  • random.choice(seq):从序列中随机选择一个元素
  • random.shuffle(seq):打乱序列(原地修改)
  • random.sample(seq, k):从序列中随机选 k 个不重复元素

示例

import random

# 生成随机整数(1-10)
print("随机整数:", random.randint(1, 10))

# 从列表随机选一个元素
fruits = ["苹果", "香蕉", "橙子"]
print("随机水果:", random.choice(fruits))

# 打乱列表
nums = [1, 2, 3, 4, 5]
random.shuffle(nums)
print("打乱后:", nums)  # 输出:[3,1,5,2,4](随机)

# 随机选 3 个不重复元素
print("随机抽样:", random.sample(range(10), 3))  # 输出:[5,2,7](随机)

八、collections 模块:扩展数据结构

功能:提供比内置类型(list、dict 等)更强大的数据结构。

常用类:

  • defaultdict:带默认值的字典(避免 KeyError)
  • deque:双端队列(高效 append/pop 两端元素)
  • Counter:计数工具(统计元素出现次数)

示例

from collections import defaultdict, deque, Counter

# defaultdict:访问不存在的键时返回默认值(如 list)
dd = defaultdict(list)  # 默认值为 list()
dd["hobbies"].append("篮球")  # 无需先初始化 list
dd["hobbies"].append("编程")
print(dd["hobbies"])  # 输出:['篮球', '编程']

# deque:双端队列(比 list 更高效的首尾操作)
dq = deque([1, 2, 3])
dq.append(4)  # 尾部加元素 → [1,2,3,4]
dq.appendleft(0)  # 头部加元素 → [0,1,2,3,4]
dq.pop()  # 尾部删 → [0,1,2,3]
dq.popleft()  # 头部删 → [1,2,3]
print(dq)

# Counter:统计元素次数
words = ["apple", "banana", "apple", "orange", "apple"]
count = Counter(words)
print(count)  # 输出:Counter({'apple': 3, 'banana': 1, 'orange': 1})
print("apple 出现次数:", count["apple"])  # 输出:3

九、itertools 模块:迭代工具

功能:提供高效的迭代器工具(简化循环逻辑)。

常用函数:

  • itertools.chain(a, b):连接两个迭代器(如 list)
  • itertools.cycle(seq):循环迭代序列(无限迭代)
  • itertools.product(a, b):计算两个序列的笛卡尔积
  • itertools.permutations(seq, k):生成序列中 k 个元素的排列

示例

import itertools

# chain:连接两个列表
a = [1, 2, 3]
b = ["a", "b"]
for item in itertools.chain(a, b):
    print(item, end=" ")  # 输出:1 2 3 a b

# product:笛卡尔积(类似嵌套循环)
colors = ["红", "蓝"]
sizes = ["S", "M"]
for c, s in itertools.product(colors, sizes):
    print(f"{c}{s}", end=" ")  # 输出:红S 红M 蓝S 蓝M

# permutations:3选2的排列
nums = [1, 2, 3]
for p in itertools.permutations(nums, 2):
    print(p, end=" ")  # 输出:(1,2) (1,3) (2,1) (2,3) (3,1) (3,2)

总结

  • 模块:单个 .py 文件,封装函数、类、变量,实现代码复用。
  • :含 __init__.py 的目录,组织多个相关模块,支持嵌套(子包)。
  • 导入方式importfrom ... importas 别名,根据需求选择。
  • 搜索路径:Python 按固定顺序查找模块,可通过 sys.path 调整。

合理使用模块和包是编写可维护代码的基础,尤其在大型项目中,模块化的组织方式能让代码结构清晰、易于扩展。

总结

模块和包在Python中一般对文件和文件夹的称呼。

  • 一个py文件就是一个模块(module)。
  • 含多个py文件的文件夹就是包(package)。

注意:在包(文件夹)中有一个默认内容为空的__init__.py的文件,一般用于描述当前包的信息(在导入他下面的模块时,也会自动加载)。

  • py2必须有,如果没有导入包就会失败。
  • py3可有可无。

当定义好一个模块或包之后,如果想要使用其中定义的功能,必须要先导入,然后再能使用。

导入,其实就是将模块或包加载的内存中,以后再去内存中去拿就行。

关于导如时的路径:

在Python内部默认设置了一些路径,导入模块或包时,都会按照指定顺序逐一去特定的路径查找。

PS C:\Users\zj> ipython
Python 3.8.8 (tags/v3.8.8:024d805, Feb 19 2021, 13:18:16) [MSC v.1928 64 bit (AMD64)]
Type 'copyright', 'credits' or 'license' for more information
IPython 7.28.0 -- An enhanced Interactive Python. Type '?' for help.

In [1]: import sys

In [2]: sys.path
Out[2]:
['C:\\Users\\zj\\AppData\\Roaming\\Python\\Python38\\Scripts\\ipython.exe',
 'c:\\program files\\python38\\python38.zip',
 'c:\\program files\\python38\\DLLs',
 'c:\\program files\\python38\\lib',
 'c:\\program files\\python38',
 '',
 'C:\\Users\\zj\\AppData\\Roaming\\Python\\Python38\\site-packages',
 'C:\\Users\\zj\\AppData\\Roaming\\Python\\Python38\\site-packages\\win32',
 'C:\\Users\\zj\\AppData\\Roaming\\Python\\Python38\\site-packages\\win32\\lib',
 'C:\\Users\\zj\\AppData\\Roaming\\Python\\Python38\\site-packages\\Pythonwin',
 'c:\\program files\\python38\\lib\\site-packages',
 'C:\\Users\\zj\\AppData\\Roaming\\Python\\Python38\\site-packages\\IPython\\extensions',
 'C:\\Users\\zj\\.ipython']

想要导入任意的模块和包,都必须写在如下路径下,才能被找到。

也可以自动手动在sys.path中添加指定路径,然后再导入可以,例如:

import sys
sys.path.append("路径A")

import xxxxx  # 导入路径A下的一个xxxxx.py文件
  1. 你以后写模块名称时,千万不能和内置和第三方的同名(新手容易犯错误)。
  2. 项目执行文件一般都在项目根目录,如果执行文件嵌套的内存目录,就需要自己手动在sys.path中添加路径。
  3. pycharm中默认会将项目目录加入到sys.path中

关于导入的方式:

导入本质上是将某个文件中的内容先加载到内存中,然后再去内存中拿过来使用。而在Python开发中常用的导入的方式有2类方式,每类方式都也多种情况。

  • 第一类:import xxxx(开发中,一般多用于导入sys.path目录下的一个py文件)
  • 第二类:from xxx import xxx 【常用】,一般适用于多层嵌套和导入模块中某个成员的情况。
  • 提示:基于from模式也可以支持 from many import *,即:导入一个模块中所有的成员(可能会重名,所以用的少)。

导入别名

如果项目中导入 成员/模块/包 有重名,那么后导入的会覆盖之前导入,为了避免这种情况的发生,Python支持重命名,即:

from xxx.xxx import xx as xo
import x1.x2 as pg

主文件

  • 执行一个py文件时
__name__ = "__main__"
  • 导入一个py文件时
__name__ = "模块名"

我们通常是执行 run.py 去运行程序,其他的py文件都是一些功能代码。当我们去执行一个文件时,文件内部的 __name__变量的值为 __main__

第三方模块

Python内部提供的模块有限,所以在平时在开发的过程中,经常会使用第三方模块。

pip(最常用)

这是Python中最最最常用的安装第三方模块的方式。

pip其实是一个第三方模块包管理工具,默认安装Python解释器时自动会安装,默认目录:

Windows系统Python安装路径的scripts目录下
    C:\Python38\Scripts\pip.exe
    C:\Python38\Scripts\pip3.exe
    C:\Python38\Scripts\pip3.8.exe

提示:为了方便在终端运行pip管理工具,我们也会把它所在的路径添加到系统环境变量中。

pip3 install 模块名称

源码安装

如果要安装的模块在pypi.org中不存在 或 因特殊原因无法通过pip install 安装时,可以直接下载源码,然后基于源码安装,例如:

  • 下载requests源码(压缩包zip、tar、tar.gz)并解压。
下载地址:https://pypi.org/project/requests/#files
  • 进入目录

  • 执行编译和安装命令

python3 setup.py build
python3 setup.py install

内置模块(一)

Python内置的模块有很多,我们也已经接触了不少相关模块,接下来咱们就来做一些汇总和介绍。

内置模块有很多 & 模块中的功能也非常多,我们是没有办法注意全局给大家讲解,在此我会整理出项目开发最常用的来进行讲解。

3.1 os

import os

# 1. 获取当前脚本绝对路径
"""
abs_path = os.path.abspath(__file__)
print(abs_path)
"""

# 2. 获取当前文件的上级目录
"""
base_path = os.path.dirname( os.path.dirname(路径) )
print(base_path)
"""

# 3. 路径拼接
"""
p1 = os.path.join(base_path, 'xx')
print(p1)

p2 = os.path.join(base_path, 'aa', 'bb', 'a1.png')
print(p2)
"""

# 4. 判断路径是否存在
"""
exists = os.path.exists(p1)
print(exists)
"""

# 5. 创建文件夹
"""
os.makedirs(路径)
"""
"""
path = os.path.join(base_path, 'aa', 'bb', 'uuuu')
if not os.path.exists(path):
    os.makedirs(path)
"""

# 6. 是否是文件夹
"""
file_path = os.path.join(base_path, 'aa', 'bb', 'uuuu.png')
is_dir = os.path.isdir(file_path)
print(is_dir) # False

folder_path = os.path.join(base_path, 'aa', 'bb', 'uuuu')
is_dir = os.path.isdir(folder_path)
print(is_dir) # True

"""

# 7. 删除文件或文件夹
"""
os.remove("文件路径")
"""
"""
path = os.path.join(base_path, 'xx')
shutil.rmtree(path)
"""
  • listdir,查看目录下所有的文件
  • walk,查看目录下所有的文件(含子孙文件)
import os

"""
data = os.listdir(r"D:\PycharmProjects")
print(data)
# ['convert.py', '__init__.py', 'page.py', '__pycache__', 'utils.py', 'tencent']
"""

"""
要遍历一个文件夹下的所有文件,例如:遍历文件夹下的所有py文件
"""

data = os.walk(r"D:\PycharmProjects")
for path, folder_list, file_list in data:
    for file_name in file_list:
        file_abs_path = os.path.join(path, file_name)
        ext = file_abs_path.rsplit(".",1)[-1]
        if ext == "py":
            print(file_abs_path)

3.2 shutil

import shutil

# 1. 删除文件夹
"""
path = os.path.join(base_path, 'xx')
shutil.rmtree(path)
"""

# 2. 拷贝文件夹
"""
shutil.copytree(r"C:\Users\zj\Desktop\files",r"D:\PycharmProjects\files")
"""

# 3.拷贝文件
"""
shutil.copy("x.png",r"D:\PycharmProjects\files")
shutil.copy(r"C:\Users\zj\Desktop\files\2x.png",r"D:\PycharmProjects\files\2x.png")
"""

# 4.文件或文件夹重命名
"""
shutil.move("x.png",r"xxx.png")
shutil.move(r"D:\PycharmProjects\files",r"D:\PycharmProjects\imgs")
"""

# 5. 压缩文件
"""
# base_name,压缩后的压缩包文件
# format,压缩的格式,例如:"zip", "tar", "gztar", "bztar", or "xztar".
# root_dir,要压缩的文件夹路径
"""
# shutil.make_archive(base_name=r'datafile',format='zip',root_dir=r'files')


# 6. 解压文件
"""
# filename,要解压的压缩包文件
# extract_dir,解压的路径
# format,压缩文件格式
"""
# shutil.unpack_archive(filename=r'datafile.zip', extract_dir=r'xxxxxx/xo', format='zip')

3.3 sys

import sys

# 1. 获取解释器版本
"""
print(sys.version)
print(sys.version_info)
print(sys.version_info.major, sys.version_info.minor, sys.version_info.micro)
"""

# 2. 导入模块路径
"""
print(sys.path)
"""
  • argv,执行脚本时,python解释器后面传入的参数
import sys

print(sys.argv)

# 例如,请实现下载图片的一个工具。

def download_image(url):
    print("下载图片", url)


def run():
    # 接受用户传入的参数
    url_list = sys.argv[1:]
    for url in url_list:
        download_image(url)


if __name__ == '__main__':
    run()

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)

3.5 hashlib

import hashlib

hash_object = hashlib.md5()
hash_object.update("ZJ".encode('utf-8'))
result = hash_object.hexdigest()
print(result)
import hashlib

hash_object = hashlib.md5("iajfsdunjaksdjfasdfasdf".encode('utf-8'))
hash_object.update("ZJ".encode('utf-8'))
result = hash_object.hexdigest()
print(result)

总结

  1. 模块和包的区别

  2. 了解如何导入模块

    • 路径
    • 导入方式
  3. 导入模块时一般要遵循的规范【补充】

    • 注释:文件顶部或init文件中。

    • 在文件顶部导入

    • 有规则导入,并用空行分割。

# 先内置模块
# 再第三方模块
# 最后自定义模块
import os
import sys
import random
import hashlib

import requests
import openpyxl

from commons.utils import encrypt
  1. 第三方模块安装的方法

  2. 常见内置模块