零基础学 Python 第14章 | 模块、包与第三方库

本章摘要

  1. 核心目标:掌握模块导入与第三方库安装,能用标准库和第三方库扩展程序功能
  2. 核心知识点:import语句、from...importas别名、math/random/time/os/json标准库、pip安装、虚拟环境
  3. 实操产出:本地日志工具,自动记录运行信息并捕获异常写入日志文件
  4. 前置基础:第13章异常处理、第11章文件读写、第7章字典

一、写在前面

上一章你学会了异常处理,程序再也不会因为一个意外错误而整个崩溃了。但回过头想想------从头到尾这么十几章,我们用的 print()input()len() 这些函数,都是从哪来的?

答案是:它们都是 Python 的内置函数 ,开机即用,不需要额外操作。但 Python 的能力远不止这些。想生成随机数?需要 random 模块。想读写 JSON 文件?需要 json 模块。想操作文件路径、获取时间?都需要导入对应模块。

这就好比你买了一部手机,出厂自带电话和短信功能(内置函数),但想用微信、抖音,就得去应用商店下载安装(导入模块/安装第三方库)。本章就来学习 Python 的"应用商店"------模块、包与第三方库。


二、什么是模块

模块(Module)就是一个 .py 文件。你写的每一个 Python 文件,本质上都是一个模块。

模块的核心作用:把功能封装好,需要时导入使用,避免重复造轮子。

Python 提供了大量标准库模块,安装 Python 时自带,开箱即用:

模块名 功能 举个例子
math 数学运算 math.sqrt(16) → 4.0
random 随机数 random.randint(1, 6) → 掷骰子
time 时间相关 time.sleep(1) → 暂停1秒
os 操作系统交互 os.getcwd() → 获取当前目录
json JSON 数据处理 json.dumps({"a": 1}) → 字典转JSON字符串

标准库是 Python 自带的"工具箱",不用安装,直接 import 就能用。


三、import 语句:导入整个模块

import 是最基础的导入方式,导入整个模块后,用 模块名.函数名 调用。

3.1 基本用法

python 复制代码
import random

# 生成 1-6 的随机整数(模拟掷骰子)
dice = random.randint(1, 6)
print(f"掷骰子结果:{dice}")

# 从列表中随机选一个(模拟抽签)
names = ["小明", "小红", "小刚", "小丽"]
lucky = random.choice(names)
print(f"今天值日生:{lucky}")

运行结果:

复制代码
掷骰子结果:4
今天值日生:小红

注意:每次运行结果可能不同,因为 random 生成的就是随机数。

3.2 一次导入多个模块

python 复制代码
import math
import time
import os

# 也可以写在一行(不推荐,可读性差)
# import math, time, os

print(math.pi)          # 3.141592653589793
print(time.time())      # 1748000000.123456(当前时间戳)
print(os.getcwd())      # /app/data(当前工作目录)

建议:一个模块一行 import,代码清晰,团队协作更友好。

3.3 import 的执行过程

当你写 import random 时,Python 做了三件事:

  1. 在标准库中找到 random.py 文件
  2. 执行该文件中的代码(只在第一次导入时执行)
  3. 在当前程序中创建一个 random 名称,指向该模块

之后再 import random,Python 不会重复执行,而是直接使用已加载的模块。


四、from...import:精准导入

import 导入整个模块,调用时要写 模块名.函数名。如果你只用其中某个函数,可以用 from...import 精准导入,直接用函数名调用。

4.1 导入单个函数

python 复制代码
from random import randint

# 不需要写 random.randint,直接用 randint
dice = randint(1, 6)
print(f"骰子点数:{dice}")

4.2 导入多个函数

python 复制代码
from random import randint, choice, shuffle

# 随机整数
print(randint(1, 100))

# 随机选择
fruits = ["苹果", "香蕉", "橙子"]
print(choice(fruits))

# 打乱顺序
cards = ["红桃A", "黑桃K", "方块Q", "梅花J"]
shuffle(cards)
print(cards)   # 顺序被打乱

运行结果:

复制代码
42
苹果
['梅花J', '红桃A', '方块Q', '黑桃K']

4.3 importfrom...import 的区别

对比项 import 模块 from 模块 import 函数
调用方式 random.randint(1,6) randint(1,6)
导入范围 整个模块 指定函数/变量
命名冲突风险 低(有模块名前缀) 较高(直接占用函数名)
可读性 一眼看出来源 简洁但来源不明确

经验:写小脚本时 from...import 更方便;写正式项目时 import 更安全,避免命名冲突。

4.4 不要用 from...import *

python 复制代码
# ❌ 不推荐:导入所有内容,容易命名冲突
from random import *

# ✅ 推荐:明确导入需要的函数
from random import randint, choice

import * 会把模块里所有名字都导入进来,如果两个模块有同名函数,后者会覆盖前者,出了 bug 很难排查。


五、as:给模块起别名

模块名太长或者有命名冲突时,可以用 as 起一个简短的别名。

python 复制代码
import random as r
from math import sqrt as sq

# 用别名调用
print(r.randint(1, 10))    # 等同于 random.randint(1, 10)
print(sq(25))              # 等同于 math.sqrt(25),结果是 5.0

别名的常见使用场景:

python 复制代码
# 社区约定俗成的别名(写项目时经常见到)
import pandas as pd        # 数据分析库
import numpy as np         # 科学计算库
import matplotlib.pyplot as plt   # 绑图库

别名只是给模块起个"小名",功能完全不变。新手阶段用的不多,但读别人的代码时经常遇到,要知道是什么意思。


六、常用标准库详解

6.1 math:数学运算

python 复制代码
import math

# 圆周率
print(math.pi)            # 3.141592653589793

# 向上取整和向下取整
print(math.ceil(3.2))     # 4
print(math.floor(3.8))    # 3

# 开平方
print(math.sqrt(16))      # 4.0

# 绝对值
print(math.fabs(-5))      # 5.0

# 幂运算
print(math.pow(2, 10))    # 1024.0

6.2 random:随机数

python 复制代码
import random

# 随机整数 [1, 10]
print(random.randint(1, 10))

# 随机小数 [0, 1)
print(random.random())

# 从列表中随机选一个
colors = ["红", "黄", "蓝"]
print(random.choice(colors))

# 随机选3个不重复的
nums = list(range(1, 50))
print(random.sample(nums, 3))

# 打乱列表顺序
cards = ["A", "2", "3", "4", "5"]
random.shuffle(cards)
print(cards)

运行结果(每次不同):

复制代码
7
0.5234...
黄
[12, 37, 5]
['3', 'A', '5', '2', '4']

6.3 time:时间操作

python 复制代码
import time

# 时间戳:从1970年1月1日到现在的秒数
print(time.time())

# 格式化时间字符串
print(time.strftime("%Y-%m-%d %H:%M:%S"))
# 2025-05-24 14:30:00

# 暂停程序2秒
print("开始等待...")
time.sleep(2)
print("2秒过去了")

time.strftime() 是写日志、打时间戳最常用的函数,记住格式 %Y-%m-%d %H:%M:%S 就够日常用了。

常用格式符速查:

格式符 含义 示例
%Y 四位年份 2025
%m 月份 05
%d 日期 24
%H 小时(24小时制) 14
%M 分钟 30
%S 00

6.4 os:操作系统交互

python 复制代码
import os

# 获取当前工作目录
print(os.getcwd())

# 列出目录下的文件和文件夹
print(os.listdir("."))

# 拼接路径(跨平台安全)
log_path = os.path.join("logs", "app.log")
print(log_path)   # logs/app.log(Windows下是 logs\app.log)

# 判断文件是否存在
print(os.path.exists("test.txt"))   # True 或 False

# 创建文件夹(如果不存在)
if not os.path.exists("logs"):
    os.mkdir("logs")
    print("logs 文件夹已创建")

os.path.join() 拼接路径时能自动适配不同操作系统的路径分隔符,比手动拼字符串 / 更安全。

6.5 json:JSON 数据处理

JSON 是网络数据交换最常用的格式,长得像 Python 字典。json 模块负责 Python 对象和 JSON 字符串之间的转换。

python 复制代码
import json

# Python 字典 → JSON 字符串(序列化)
student = {"name": "小明", "age": 18, "scores": [85, 90, 78]}
json_str = json.dumps(student, ensure_ascii=False)
print(json_str)
# {"name": "小明", "age": 18, "scores": [85, 90, 78]}

# JSON 字符串 → Python 字典(反序列化)
data = json.loads(json_str)
print(data["name"])           # 小明
print(data["scores"][1])      # 90

ensure_ascii=False 让中文字符正常显示,不加这个参数中文会变成 \u5c0f\u660e 这种转义码。

把数据保存为 JSON 文件:

python 复制代码
import json

# 写入 JSON 文件
config = {"app_name": "我的工具", "version": "1.0", "debug": True}
with open("config.json", "w", encoding="utf-8") as f:
    json.dump(config, f, ensure_ascii=False, indent=2)
print("配置已保存到 config.json")

# 读取 JSON 文件
with open("config.json", "r", encoding="utf-8") as f:
    loaded = json.load(f)
print(f"应用名:{loaded['app_name']}")
print(f"版本号:{loaded['version']}")

json.dumps() / json.loads() 处理字符串,json.dump() / json.load() 处理文件,一个有 s(string)一个没有,注意区分。


七、pip:安装第三方库

标准库是 Python 自带的,但很多强大功能需要第三方库 ------由全球开发者贡献的扩展包。安装第三方库用 pip 命令。

7.1 安装第三方库

打开终端(命令行),执行:

bash 复制代码
# 安装 requests 库(用来发网络请求)
pip install requests

# 安装指定版本
pip install requests==2.28.0

# 升级到最新版
pip install --upgrade requests

Windows 如果提示找不到 pip,试试 python -m pip install requests

7.2 常用 pip 命令

命令 作用
pip install 包名 安装第三方库
pip uninstall 包名 卸载第三方库
pip list 查看已安装的所有库
pip show 包名 查看某个库的详细信息
pip install --upgrade 包名 升级库到最新版

7.3 安装后使用

python 复制代码
# 安装好 requests 后,像标准库一样 import 使用
import requests

# 获取一个网页内容
response = requests.get("https://httpbin.org/get")
print(response.status_code)   # 200
print(response.json())        # 返回的JSON数据

第三方库安装好后,使用方式和标准库完全一样------都是 import 导入。

7.4 常用第三方库推荐

库名 功能 安装命令
requests 发送 HTTP 网络请求 pip install requests
openpyxl 读写 Excel 文件 pip install openpyxl
pandas 数据分析与处理 pip install pandas
pillow 图片处理 pip install pillow
beautifulsoup4 网页内容解析 pip install beautifulsoup4

八、虚拟环境:隔离项目依赖

8.1 为什么需要虚拟环境

假设项目 A 需要 requests 2.28,项目 B 需要 requests 2.31。如果都装在全局环境里,版本冲突不可避免。

虚拟环境的作用:为每个项目创建独立的 Python 环境,互不干扰。

8.2 创建和使用虚拟环境

bash 复制代码
# 1. 创建虚拟环境(命名为 venv)
python -m venv venv

# 2. 激活虚拟环境
# Windows:
venv\Scripts\activate
# Mac/Linux:
source venv/bin/activate

# 3. 激活后安装库(只装在当前虚拟环境里)
pip install requests

# 4. 退出虚拟环境
deactivate

新手阶段不用纠结虚拟环境,先用全局环境学习就行。等你开始做多个项目时,虚拟环境就是必备技能了。


九、Scratch 积木对照

Scratch Python 说明
「添加扩展:画笔/音乐」 pip install 第三方库 Scratch 扩展库 → Python pip 安装第三方库,都是给程序"装插件"
python 复制代码
# Scratch「添加扩展」→ Python 对照
# Scratch: 点击"添加扩展"→ 选择"画笔"→ 积木区出现画笔积木
# Python: 终端执行 pip install → 代码中 import → 使用功能
# 安装 Pillow 库来处理图片(类似 Scratch 安装画笔扩展)
# pip install pillow
# from PIL import Image

Scratch 里想用画笔功能,得先去"添加扩展"里勾选画笔,然后积木区才会出现画笔积木。Python 里想用第三方库,得先用 pip install 安装,然后代码里 import 才能使用。思路一模一样------先装插件,再用功能。


十、综合实战:本地日志工具 + 报错捕获工具(第四部分毕业案例)

这是第四部分(第10-14章)的毕业案例,综合运用文件读写、异常处理和模块导入(time/os/json),写一个实用的日志工具。

功能需求:

  1. 自动记录程序运行信息到日志文件,每条带时间戳
  2. 出错时自动捕获异常,把错误类型和详情写入日志
  3. 支持读取日志文件查看历史记录

完整源码

python 复制代码
# ========================================
# 本地日志工具 + 报错捕获工具
# 综合运用:文件读写 + 异常处理 + 模块导入(time/os/json)
# ========================================

import time
import os
import json

# 日志文件路径
LOG_DIR = "logs"
LOG_FILE = os.path.join(LOG_DIR, "app.log")


def write_log(level, message):
    """写入一条日志(带时间戳)"""
    # 确保日志目录存在
    if not os.path.exists(LOG_DIR):
        os.mkdir(LOG_DIR)

    # 生成时间戳
    timestamp = time.strftime("%Y-%m-%d %H:%M:%S")

    # 拼接日志行
    log_line = f"[{timestamp}] [{level}] {message}\n"

    # 追加写入日志文件
    with open(LOG_FILE, "a", encoding="utf-8") as f:
        f.write(log_line)

    # 同时在控制台输出
    print(log_line, end="")


def read_logs():
    """读取并显示所有日志"""
    if not os.path.exists(LOG_FILE):
        print("日志文件不存在,还没有任何记录")
        return

    print("=" * 50)
    print("           日志记录")
    print("=" * 50)
    with open(LOG_FILE, "r", encoding="utf-8") as f:
        content = f.read()
        if content:
            print(content)
        else:
            print("(日志为空)")
    print("=" * 50)


def safe_divide(a, b):
    """安全除法:出错时捕获异常并记录到日志"""
    try:
        result = a / b
        write_log("INFO", f"除法成功:{a} / {b} = {result}")
        return result
    except ZeroDivisionError as e:
        write_log("ERROR", f"除法失败:{a} / {b},错误类型:{type(e).__name__},错误信息:{e}")
        return None
    except TypeError as e:
        write_log("ERROR", f"类型错误:错误类型:{type(e).__name__},错误信息:{e}")
        return None


def save_stats(stats):
    """把统计信息保存为 JSON 文件"""
    stats_file = os.path.join(LOG_DIR, "stats.json")
    with open(stats_file, "w", encoding="utf-8") as f:
        json.dump(stats, f, ensure_ascii=False, indent=2)
    write_log("INFO", f"统计信息已保存到 {stats_file}")


def load_stats():
    """从 JSON 文件读取统计信息"""
    stats_file = os.path.join(LOG_DIR, "stats.json")
    if not os.path.exists(stats_file):
        write_log("WARNING", "统计文件不存在,返回空字典")
        return {}
    with open(stats_file, "r", encoding="utf-8") as f:
        return json.load(f)


# ========== 主程序 ==========
write_log("INFO", "程序启动")

# 正常操作
write_log("INFO", "开始执行计算任务")

# 正常除法
safe_divide(100, 5)

# 触发除零错误(自动捕获并记录)
safe_divide(50, 0)

# 触发类型错误(自动捕获并记录)
safe_divide("hello", 5)

# 保存统计数据
stats = {
    "run_time": time.strftime("%Y-%m-%d %H:%M:%S"),
    "total_operations": 3,
    "success": 1,
    "failed": 2,
    "description": "本次运行统计"
}
save_stats(stats)

# 读取并显示统计
loaded = load_stats()
print(f"\n读取到的统计信息:")
for key, value in loaded.items():
    print(f"  {key}: {value}")

write_log("INFO", "程序正常结束")

# 显示完整日志
print()
read_logs()

运行结果:

复制代码
[2025-05-24 14:30:00] [INFO] 程序启动
[2025-05-24 14:30:00] [INFO] 开始执行计算任务
[2025-05-24 14:30:00] [INFO] 除法成功:100 / 5 = 20.0
[2025-05-24 14:30:00] [ERROR] 除法失败:50 / 0,错误类型:ZeroDivisionError,错误信息:division by zero
[2025-05-24 14:30:00] [ERROR] 类型错误:错误类型:TypeError,错误信息:unsupported operand type(s) for /: 'str' and 'int'
[2025-05-24 14:30:00] [INFO] 统计信息已保存到 logs/stats.json

读取到的统计信息:
  run_time: 2025-05-24 14:30:00
  total_operations: 3
  success: 1
  failed: 2
  description: 本次运行统计
[2025-05-24 14:30:00] [INFO] 程序正常结束

==================================================
           日志记录
==================================================
[2025-05-24 14:30:00] [INFO] 程序启动
[2025-05-24 14:30:00] [INFO] 开始执行计算任务
[2025-05-24 14:30:00] [INFO] 除法成功:100 / 5 = 20.0
[2025-05-24 14:30:00] [ERROR] 除法失败:50 / 0,错误类型:ZeroDivisionError,错误信息:division by zero
[2025-05-24 14:30:00] [ERROR] 类型错误:错误类型:TypeError,错误信息:unsupported operand type(s) for /: 'str' and 'int'
[2025-05-24 14:30:00] [INFO] 统计信息已保存到 logs/stats.json
[2025-05-24 14:30:00] [INFO] 程序正常结束
==================================================

分步拆解

  1. 日志写入函数 write_log() :用 time.strftime() 生成时间戳,用文件追加模式 "a" 写入,确保历史日志不被覆盖。同时 print 到控制台,方便实时查看。

  2. 日志目录管理 :用 os.path.exists() 检查 logs 目录是否存在,不存在就 os.mkdir() 创建。os.path.join() 拼接路径,跨平台兼容。

  3. 安全除法 safe_divide() :用 try...except 捕获 ZeroDivisionError(除零错误)和 TypeError(类型错误),出错时调用 write_log() 把错误类型和错误信息写入日志,程序不会崩溃。

  4. JSON 统计数据保存 save_stats() :把运行统计(成功次数、失败次数等)用 json.dump() 保存为 JSON 文件,方便后续分析。ensure_ascii=False 确保中文正常显示,indent=2 让 JSON 文件格式美观。

  5. JSON 数据读取 load_stats() :用 json.load() 读取 JSON 文件,返回 Python 字典。文件不存在时返回空字典,避免报错。

  6. 主程序流程:先记录启动 → 执行正常除法 → 故意触发两种错误(被自动捕获)→ 保存统计 → 读取统计 → 记录结束 → 打印完整日志。整个过程中即使出错,程序也不会中断。

这个案例模拟了真实项目中的日志系统:生产环境的程序几乎都会用类似的机制记录运行状态,出了问题靠查日志定位原因。


十一、常见报错速查表

报错信息 出现场景 原因 解决方法
ModuleNotFoundError: No module named 'xxx' import 导入模块 模块名拼写错误或未安装 检查拼写;第三方库用 pip install xxx 安装
ImportError: cannot import name 'xxx' from 'yyy' from...import 导入 函数名拼写错误或该模块无此函数 查阅官方文档确认函数名
json.decoder.JSONDecodeError json.loads() 解析 JSON 字符串格式不合法 检查 JSON 格式是否正确(引号、括号、逗号)
TypeError: the JSON object must be str json.loads() 传入的不是字符串类型 确保传入 json.loads() 的是字符串,不是字典
FileNotFoundError open() 打开文件 文件路径不存在或路径拼错 os.path.exists() 先检查路径
PermissionError 文件写入 文件被占用或没有写入权限 关闭占用该文件的程序,检查目录权限

十二、本章小结

本章你掌握了 Python 模块与第三方库的完整使用:

  1. import 语句 ------导入整个模块,用 模块名.函数名 调用,最安全
  2. from...import------精准导入指定函数,调用时不用写模块名,更简洁
  3. as 别名------给模块或函数起简短别名,方便书写
  4. 常用标准库 ------math 做数学运算、random 生成随机数、time 操作时间、os 交互系统、json 处理 JSON 数据
  5. pip 安装第三方库 ------pip install 包名 安装,import 导入使用
  6. 虚拟环境------为每个项目创建独立的 Python 环境,避免依赖冲突

模块化编程是 Python 的核心能力之一。掌握了 importpip,你就拥有了调用整个 Python 生态的钥匙------从网页爬虫到数据分析,从机器学习到自动化办公,全都从这两条命令开始。

往期回顾:

《Python 零基础入门:从积木到代码》专栏序

零基础学 Python 第1章 | 全平台装环境 + VS Code 配置 + 第一个 Hello World

零基础学 Python 第2章 | print 输出 + 变量赋值 + input 交互输入

零基础学 Python 第3章 | 条件判断:if / elif / else

零基础学 Python 第 4 章 | for 循环与 range():让程序帮你重复干活

零基础学 Python 第 5 章 | while 循环与循环嵌套:让程序看着条件自己干活

零基础学 Python 第 6 章 | 元组与集合:不可变数据与自动去重

零基础学 Python 第7章 | 字典 dict:键值对存储

零基础学 Python 第8章 | 字符串操作与格式化输出

零基础学 Python 第9章 | 函数基础:def、参数与返回值

零基础学 Python 第10章 | 函数进阶:参数灵活用法与作用域

零基础学 Python 第11章 | 匿名函数与高阶函数

零基础学 Python 第12章 | 文件读写:让数据持久保存

零基础学 Python 第13章 | 异常处理:try-except 让程序不崩溃

下一章预告 :到目前为止,你写的程序都是"面向过程"的------一步一步告诉计算机做什么。下一章我们进入 Python 的"面向对象编程(Object-Oriented Programming)"(OOP),学习类与对象,用"造模具再生产"的思路组织代码,打开 Python 进阶的大门。


文末资源区

资源 说明
Python 官方文档 - 模块 https://docs.python.org/3/tutorial/modules.html
Python 官方文档 - 标准库 https://docs.python.org/3/library/index.html
pip 官方文档 https://pip.pypa.io/en/stable/
Python 官方文档 - venv 虚拟环境 https://docs.python.org/3/library/venv.html
本章完整源码 chapter14_all.py(关注梅雅达编程笔记,评论领资料)

每节课都配套课后练习题与完整源码。代码报错、看不懂知识点,可在评论区粘贴问题,逐一解答!

欢迎关注梅雅达编程笔记,持续分享Python零基础学习内容

相关推荐
Mr__Miss16 小时前
Java泛型完全指南:从入门到精通
java·开发语言·python
赵庆明老师16 小时前
Vben精讲:14-Vben远程加载语言包
开发语言·vben
嘿丨嘿17 小时前
VLA 入门(六):VLA 如何进行强化学习后训练?
人工智能·python·深度学习·机器人
hehelm17 小时前
AI大模型接入SDK—通用模块设计
linux·开发语言·c++
祉猷并茂,雯华若锦18 小时前
Appium 3.x实战:获取元素属性全解析
python·appium·自动化
宠友信息18 小时前
消息序号如何保证即时通讯源码聊天记录稳定加载
java·spring boot·redis·python·mysql·uni-app
小柯南敲键盘19 小时前
批量图片翻译与视频字幕一站式解决高效跨境电商沟通难题
大数据·人工智能·python·音视频
行思理19 小时前
微信支付“商家转账用户确认模式”,新手教程
java·开发语言·微信
麻瓜老宋20 小时前
AI开发C语言应用按步走,表达式计算器calc的第一步,中缀表达式词法分析
c语言·开发语言·atomcode