Python 标准库与 IO 操作
标签: #Python #标准库 #IO操作
学习周期:2 天 | 核心目标:掌握 Python 常用标准库与文件读写
2.6 标准库常用模块(Java 转 Python 必知)
Python 标准库提供了丰富的功能,无需额外安装即可使用,对应 Java 中常用的 JDK 工具类。
2.6.1 os 模块:文件和目录操作
对应 Java 中的 java.io.File 类,用于路径处理、文件/目录管理,跨平台兼容。
python
import os
# 1. 路径操作(使用 os.path.join 自动适配系统分隔符)
cwd = os.getcwd() # 获取当前工作目录
print(f"当前目录:{cwd}")
path = os.path.join("dir", "subdir", "file.txt") # dir/subdir/file.txt
print(os.path.abspath(path)) # 获取绝对路径
print(os.path.exists(path)) # 判断路径是否存在
print(os.path.isdir(path)) # 判断是否为目录
print(os.path.isfile(path)) # 判断是否为文件
# 2. 文件/目录操作
os.makedirs("test_dir", exist_ok=True) # 创建目录(exist_ok=True:存在不报错)
os.rename("old.txt", "new.txt") # 重命名文件/目录
os.remove("file.txt") # 删除文件
os.rmdir("test_dir") # 删除空目录
# 3. 列出目录内容
print(os.listdir(".")) # 列出当前目录所有文件/目录
# 4. 运行系统命令(不推荐,用 subprocess 更安全)
os.system("ls -l") # Linux/macOS
# os.system("dir") # Windows
2.6.2 sys 模块:系统参数与路径
对应 Java 中的 System 类,用于获取系统信息、控制程序执行。
python
import sys
# 1. 命令行参数(argv[0] 是脚本名,后续是传入的参数)
print(f"脚本名:{sys.argv[0]}")
print(f"参数列表:{sys.argv[1:]}") # 例如:python script.py arg1 → ['arg1']
# 2. 模块搜索路径(动态添加路径,解决导入问题)
print(sys.path) # 查看所有搜索路径
sys.path.append("/path/to/your/modules") # 临时添加自定义模块路径
# 3. 退出程序
# sys.exit(0) # 0 表示正常退出,非0表示异常退出
# 4. 获取 Python 版本信息
print(sys.version) # Python 版本号
print(sys.platform) # 操作系统平台:win32 / darwin / linux
2.6.3 datetime 和 time:日期时间处理
datetime 更推荐(面向对象,对应 Java 8+ 的 LocalDateTime),time 偏底层。
python
import datetime
import time
# === datetime 模块 ===
from datetime import datetime, timedelta
# 获取当前时间
now = datetime.now()
print(f"当前时间:{now}")
print(f"日期:{now.date()},时间:{now.time()}")
# 创建指定时间
dt = datetime(2025, 12, 25, 10, 30, 0)
# 时间格式化(strftime:datetime → 字符串)
print(now.strftime("%Y-%m-%d %H:%M:%S")) # 2025-03-15 14:30:25
print(now.strftime("%Y年%m月%d日")) # 2025年03月15日
# 字符串解析为时间(strptime:字符串 → datetime)
date_str = "2025-03-15 12:00:00"
parsed = datetime.strptime(date_str, "%Y-%m-%d %H:%M:%S")
# 时间计算(timedelta)
tomorrow = now + timedelta(days=1)
yesterday = now - timedelta(days=1)
one_hour_later = now + timedelta(hours=1)
# 时间戳转换
timestamp = now.timestamp() # datetime → 时间戳(秒)
dt_from_ts = datetime.fromtimestamp(timestamp) # 时间戳 → datetime
# === time 模块 ===
print(time.time()) # 当前时间戳
time.sleep(2) # 暂停 2 秒
2.6.4 json 模块:JSON 序列化/反序列化
对应 Java 中的 Jackson/Gson,是对接 API 的核心模块。
python
import json
# Python 对象 → JSON 字符串(序列化)
data = {
"name": "张三",
"age": 25,
"is_student": False,
"scores": [85, 92, 78],
"address": None
}
json_str = json.dumps(data, ensure_ascii=False, indent=2)
# ensure_ascii=False:显示中文,indent=2:格式化缩进
print(json_str)
# JSON 字符串 → Python 对象(反序列化)
json_input = '{"name": "李四", "age": 30}'
obj = json.loads(json_input)
print(obj["name"]) # 李四
# 文件读写
with open("data.json", "w", encoding="utf-8") as f:
json.dump(data, f, ensure_ascii=False, indent=2)
with open("data.json", "r", encoding="utf-8") as f:
loaded = json.load(f)
print(loaded["name"])
2.6.5 math 和 random:数学运算与随机数
math:对应 Java 的java.lang.Mathrandom:对应 Java 的java.util.Random
python
import math
import random
# === math 模块 ===
print(math.pi) # 圆周率 3.14159...
print(math.e) # 自然常数 2.71828...
print(math.sqrt(16)) # 4.0
print(math.pow(2, 3)) # 8.0
print(math.floor(3.7)) # 3(向下取整)
print(math.ceil(3.1)) # 4(向上取整)
print(math.gcd(12, 18)) # 6(最大公约数)
# === random 模块 ===
print(random.random()) # [0.0, 1.0) 随机浮点数
print(random.randint(1, 10)) # [1, 10] 随机整数
print(random.choice(["a","b","c"])) # 随机选择一个元素
print(random.sample(range(100), 5)) # 随机抽样 5 个不重复元素
lst = [1, 2, 3, 4, 5]
random.shuffle(lst) # 打乱顺序(原地修改)
print(lst)
2.6.6 re 模块:正则表达式
对应 Java 的 java.util.regex.Pattern/Matcher,用于字符串匹配、搜索、替换。
python
import re
text = "我的电话是:13812345678,邮箱是:test@example.com"
# match:从开头匹配(匹配成功返回 Match 对象,否则 None)
result = re.match(r"我的电话", text)
if result:
print(result.group()) # 我的电话
# search:搜索整个字符串(找到第一个匹配)
result = re.search(r"\d{11}", text) # 匹配11位手机号
print(result.group()) # 13812345678
# findall:查找所有匹配(返回列表)
emails = re.findall(r"\w+@\w+\.\w+", text)
print(emails) # ['test@example.com']
# sub:替换匹配内容
new_text = re.sub(r"\d{11}", "***", text)
print(new_text) # 我的电话是:***,邮箱是:test@example.com
# 分割字符串
parts = re.split(r"[,,。]", "苹果,香蕉。橘子")
print(parts)
# 编译正则(提高性能)
phone_re = re.compile(r"\d{11}")
print(phone_re.findall(text))
2.7 IO 操作
2.7.1 文本文件读写
使用 open() 函数,强烈推荐 with 上下文管理器:自动关闭文件,避免资源泄漏。
文件模式说明:
| 模式 | 说明 |
|---|---|
'r' |
只读(默认) |
'w' |
写入(覆盖,文件不存在则创建) |
'a' |
追加(文件不存在则创建) |
'x' |
独占创建,文件已存在则报错 |
'b' |
二进制模式(如 'rb'、'wb') |
'+' |
读写模式(如 'r+') |
python
# 写入文件(覆盖)
with open("test.txt", "w", encoding="utf-8") as f:
f.write("第一行\n")
f.write("第二行\n")
f.writelines(["第三行\n", "第四行\n"])
# 追加写入
with open("test.txt", "a", encoding="utf-8") as f:
f.write("追加的行\n")
# 读取全部内容
with open("test.txt", "r", encoding="utf-8") as f:
content = f.read()
print(content)
# 按行读取(推荐大文件)
with open("test.txt", "r", encoding="utf-8") as f:
for line in f:
print(line.strip()) # strip() 去除换行符
# 读取所有行到列表
with open("test.txt", "r", encoding="utf-8") as f:
lines = f.readlines()
print(lines)
2.7.2 二进制文件读写
用于图片、音频、视频等非文本文件。
python
# 复制图片
with open("source.jpg", "rb") as src:
with open("copy.jpg", "wb") as dst:
dst.write(src.read())
2.7.3 CSV 文件读写(csv 模块)
CSV(逗号分隔值)是常见的数据交换格式,也可为后续学习 pandas 做铺垫。
python
import csv
# 写入 CSV(writer 方式)
data = [
["姓名", "年龄", "成绩"],
["张三", 20, 90],
["李四", 21, 85]
]
with open("scores.csv", "w", encoding="utf-8", newline="") as f:
writer = csv.writer(f)
writer.writerows(data)
# 读取 CSV(reader 方式)
with open("scores.csv", "r", encoding="utf-8") as f:
reader = csv.reader(f)
for row in reader:
print(row)
# 字典方式读写(DictWriter/DictReader,更直观)
data_dict = [
{"姓名": "张三", "年龄": 20, "成绩": 90},
{"姓名": "李四", "年龄": 21, "成绩": 85}
]
with open("scores_dict.csv", "w", encoding="utf-8", newline="") as f:
fieldnames = ["姓名", "年龄", "成绩"]
writer = csv.DictWriter(f, fieldnames=fieldnames)
writer.writeheader() # 写入表头
writer.writerows(data_dict)
with open("scores_dict.csv", "r", encoding="utf-8") as f:
reader = csv.DictReader(f)
for row in reader:
print(row["姓名"], row["成绩"])
2.7.4 JSON 文件读写(json 模块)
详见 2.6.4 节,这里补充一个完整示例。
python
import json
# 写入 JSON 文件
grades = {
"class": "三年级二班",
"students": [
{"name": "小明", "score": 95},
{"name": "小红", "score": 88}
]
}
with open("grades.json", "w", encoding="utf-8") as f:
json.dump(grades, f, ensure_ascii=False, indent=2)
# 读取 JSON 文件
with open("grades.json", "r", encoding="utf-8") as f:
loaded = json.load(f)
print(loaded["class"])
for stu in loaded["students"]:
print(stu["name"], stu["score"])
🎯 练习项目:命令行版学生成绩管理系统
功能要求
- 使用 列表 + 字典 存储学生数据(例如:
[{"id": 1, "name": "张三", "score": 90}, ...]) - 支持 增删改查 操作,并显示统计信息(平均分、最高分、最低分)
- 数据保存到 JSON 文件(程序启动时加载,退出时保存)
完整代码
python
# manager.py
import json
import os
DATA_FILE = "students.json"
def load_data():
"""从 JSON 文件加载数据"""
if not os.path.exists(DATA_FILE):
return []
with open(DATA_FILE, "r", encoding="utf-8") as f:
return json.load(f)
def save_data(students):
"""保存数据到 JSON 文件"""
with open(DATA_FILE, "w", encoding="utf-8") as f:
json.dump(students, f, ensure_ascii=False, indent=2)
def add_student(students):
"""添加学生"""
name = input("请输入姓名:")
try:
score = float(input("请输入成绩:"))
except ValueError:
print("成绩必须是数字!")
return
# 自动生成 ID
new_id = max([s["id"] for s in students], default=0) + 1
students.append({"id": new_id, "name": name, "score": score})
print(f"学生 {name} 添加成功!")
def list_students(students):
"""显示所有学生"""
if not students:
print("暂无学生数据。")
return
print("\n学生列表:")
print("-" * 40)
for stu in students:
print(f"ID:{stu['id']},姓名:{stu['name']},成绩:{stu['score']} 分")
print("-" * 40)
def update_student(students):
"""修改学生成绩"""
if not students:
print("暂无学生数据。")
return
list_students(students)
try:
sid = int(input("请输入要修改的学生 ID:"))
for stu in students:
if stu["id"] == sid:
new_score = float(input("请输入新成绩:"))
stu["score"] = new_score
print("修改成功!")
return
print("未找到该 ID。")
except ValueError:
print("输入无效!")
def delete_student(students):
"""删除学生"""
if not students:
print("暂无学生数据。")
return
list_students(students)
try:
sid = int(input("请输入要删除的学生 ID:"))
for i, stu in enumerate(students):
if stu["id"] == sid:
removed = students.pop(i)
print(f"学生 {removed['name']} 已删除。")
return
print("未找到该 ID。")
except ValueError:
print("输入无效!")
def show_statistics(students):
"""显示统计信息"""
if not students:
print("暂无学生数据。")
return
scores = [s["score"] for s in students]
avg = sum(scores) / len(scores)
max_score = max(scores)
min_score = min(scores)
print(f"\n统计信息:")
print(f"学生总数:{len(students)}")
print(f"平均分:{avg:.2f}")
print(f"最高分:{max_score}")
print(f"最低分:{min_score}")
def main():
students = load_data()
while True:
print("\n===== 学生成绩管理系统 =====")
print("1. 添加学生")
print("2. 查看所有学生")
print("3. 修改成绩")
print("4. 删除学生")
print("5. 统计信息")
print("6. 退出")
choice = input("请选择操作(1-6):")
if choice == "1":
add_student(students)
save_data(students)
elif choice == "2":
list_students(students)
elif choice == "3":
update_student(students)
save_data(students)
elif choice == "4":
delete_student(students)
save_data(students)
elif choice == "5":
show_statistics(students)
elif choice == "6":
save_data(students)
print("数据已保存,再见!")
break
else:
print("无效选择,请重新输入。")
if __name__ == "__main__":
main()
运行示例
===== 学生成绩管理系统 =====
1. 添加学生
2. 查看所有学生
3. 修改成绩
4. 删除学生
5. 统计信息
6. 退出
请选择操作(1-6):1
请输入姓名:张三
请输入成绩:88.5
学生 张三 添加成功!
...
📚 学习资料(Obsidian 可直接收藏)
-
官方文档
Python 标准库概览
os 模块
sys 模块
datetime 模块
json 模块
re 模块
文件读写
csv 模块 -
中文教程
廖雪峰 - 常用内建模块
廖雪峰 - 文件读写
菜鸟教程 - Python 标准库
正则表达式 30 分钟入门
🎯 学习建议(2 天计划)
-
第 1 天(标准库)
- 重点掌握
os、sys、datetime、json、random、re - 每个模块练习 3-5 个小例子
- 重点掌握
-
第 2 天(IO 操作)
- 掌握
with open读写文本文件 - 学会用
csv和json模块读写结构化数据 - 完成学生成绩管理系统
- 掌握
✅ 核心要点总结
-
标准库常用模块:
os:跨平台路径拼接、文件/目录操作sys:命令行参数、模块搜索路径、程序退出datetime:日期时间创建、格式化、计算json:序列化/反序列化(dumps/loads字符串,dump/load文件)math/random:数学函数、随机数生成re:正则匹配、搜索、替换
-
IO 操作:
- 文本文件:使用
with上下文管理器,指定encoding="utf-8" - 二进制文件:
'rb'/'wb'模式 - CSV:
csv.reader/csv.writer及字典读写 - JSON:
json.dump()写入文件,json.load()读取文件
- 文本文件:使用
练习题(自测)
- 使用
os模块创建一个目录test_dir,在该目录下创建文件hello.txt,写入"Hello World"。 - 使用
datetime计算你出生到现在过了多少天。 - 写一个随机密码生成器,长度 8-12 位,包含大小写字母和数字。
- 使用正则表达式验证邮箱格式(简单版:包含
@和.)。 - 读取一个 CSV 文件,计算某列的平均值。
- 完成上面的学生成绩管理系统,并添加按成绩排序功能(按分数从高到低显示)。
建议将项目代码保存并运行,增加新功能如按姓名搜索、成绩等级评定等。