AI_Python基础-4.标准库与IO

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 datetimetime:日期时间处理

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 mathrandom:数学运算与随机数

  • math:对应 Java 的 java.lang.Math
  • random:对应 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"])

🎯 练习项目:命令行版学生成绩管理系统

功能要求

  1. 使用 列表 + 字典 存储学生数据(例如:[{"id": 1, "name": "张三", "score": 90}, ...]
  2. 支持 增删改查 操作,并显示统计信息(平均分、最高分、最低分)
  3. 数据保存到 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 可直接收藏)


🎯 学习建议(2 天计划)

  1. 第 1 天(标准库)

    • 重点掌握 ossysdatetimejsonrandomre
    • 每个模块练习 3-5 个小例子
  2. 第 2 天(IO 操作)

    • 掌握 with open 读写文本文件
    • 学会用 csvjson 模块读写结构化数据
    • 完成学生成绩管理系统

✅ 核心要点总结

  1. 标准库常用模块

    • os:跨平台路径拼接、文件/目录操作
    • sys:命令行参数、模块搜索路径、程序退出
    • datetime:日期时间创建、格式化、计算
    • json:序列化/反序列化(dumps/loads 字符串,dump/load 文件)
    • math/random:数学函数、随机数生成
    • re:正则匹配、搜索、替换
  2. IO 操作

    • 文本文件:使用 with 上下文管理器,指定 encoding="utf-8"
    • 二进制文件:'rb' / 'wb' 模式
    • CSV:csv.reader / csv.writer 及字典读写
    • JSON:json.dump() 写入文件,json.load() 读取文件

练习题(自测)

  1. 使用 os 模块创建一个目录 test_dir,在该目录下创建文件 hello.txt,写入 "Hello World"
  2. 使用 datetime 计算你出生到现在过了多少天。
  3. 写一个随机密码生成器,长度 8-12 位,包含大小写字母和数字。
  4. 使用正则表达式验证邮箱格式(简单版:包含 @.)。
  5. 读取一个 CSV 文件,计算某列的平均值。
  6. 完成上面的学生成绩管理系统,并添加按成绩排序功能(按分数从高到低显示)。

建议将项目代码保存并运行,增加新功能如按姓名搜索、成绩等级评定等。

相关推荐
程序猿编码5 小时前
大模型的“文字障眼法“:FlipAttack 文本反转越狱技术全解析
linux·python·ai·大模型
吃好睡好便好5 小时前
在Matlab中绘制质点运动轨迹图
开发语言·学习·算法·matlab·信息可视化
richard_yuu5 小时前
C#开发全景概述:从零读懂C#的定位、优势与完整技术体系
开发语言·c#
Xin_ye100865 小时前
C# 零基础到精通教程 - 第十二章:异常处理与调试——让程序更健壮
开发语言·c#
楼田莉子5 小时前
C#学习之C#入门学习
开发语言·后端·学习·c#
晚烛5 小时前
CANN 数据流与内存优化:L1/L2 缓存机制与计算重叠深度解析
人工智能·python·缓存
xiao5kou4chang6kai45 小时前
如何用Python处理气象海洋数据?台风数据爬取、SST的EOF分析、WRF剖面图绘制
python·气象·台风·wrf·海洋
我命由我123455 小时前
PHP - PHP 简易 Web 服务器、基础接口开发
服务器·开发语言·前端·php·intellij-idea·idea·intellij idea
Reload.5 小时前
CZ航司,shopping JS逆向 acw_sc__v2
开发语言·javascript·python·网络爬虫·ecmascript