本章摘要
- 核心目标:掌握模块导入与第三方库安装,能用标准库和第三方库扩展程序功能
- 核心知识点:
import语句、from...import、as别名、math/random/time/os/json标准库、pip安装、虚拟环境 - 实操产出:本地日志工具,自动记录运行信息并捕获异常写入日志文件
- 前置基础:第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 做了三件事:
- 在标准库中找到
random.py文件 - 执行该文件中的代码(只在第一次导入时执行)
- 在当前程序中创建一个
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 import 与 from...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),写一个实用的日志工具。
功能需求:
- 自动记录程序运行信息到日志文件,每条带时间戳
- 出错时自动捕获异常,把错误类型和详情写入日志
- 支持读取日志文件查看历史记录
完整源码
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] 程序正常结束
==================================================
分步拆解
-
日志写入函数
write_log():用time.strftime()生成时间戳,用文件追加模式"a"写入,确保历史日志不被覆盖。同时print到控制台,方便实时查看。 -
日志目录管理 :用
os.path.exists()检查logs目录是否存在,不存在就os.mkdir()创建。os.path.join()拼接路径,跨平台兼容。 -
安全除法
safe_divide():用try...except捕获ZeroDivisionError(除零错误)和TypeError(类型错误),出错时调用write_log()把错误类型和错误信息写入日志,程序不会崩溃。 -
JSON 统计数据保存
save_stats():把运行统计(成功次数、失败次数等)用json.dump()保存为 JSON 文件,方便后续分析。ensure_ascii=False确保中文正常显示,indent=2让 JSON 文件格式美观。 -
JSON 数据读取
load_stats():用json.load()读取 JSON 文件,返回 Python 字典。文件不存在时返回空字典,避免报错。 -
主程序流程:先记录启动 → 执行正常除法 → 故意触发两种错误(被自动捕获)→ 保存统计 → 读取统计 → 记录结束 → 打印完整日志。整个过程中即使出错,程序也不会中断。
这个案例模拟了真实项目中的日志系统:生产环境的程序几乎都会用类似的机制记录运行状态,出了问题靠查日志定位原因。
十一、常见报错速查表
| 报错信息 | 出现场景 | 原因 | 解决方法 |
|---|---|---|---|
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 模块与第三方库的完整使用:
import语句 ------导入整个模块,用模块名.函数名调用,最安全from...import------精准导入指定函数,调用时不用写模块名,更简洁as别名------给模块或函数起简短别名,方便书写- 常用标准库 ------math 做数学运算、
random生成随机数、time操作时间、os交互系统、json处理 JSON 数据 pip安装第三方库 ------pip install 包名安装,import导入使用- 虚拟环境------为每个项目创建独立的 Python 环境,避免依赖冲突
模块化编程是 Python 的核心能力之一。掌握了 import 和 pip,你就拥有了调用整个 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 第9章 | 函数基础:def、参数与返回值
零基础学 Python 第10章 | 函数进阶:参数灵活用法与作用域
零基础学 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零基础学习内容

