📚 全栈开发学习系列
01 路线总览与环境搭建 ✅
02 Python 语法基础 ✅
03 Python 进阶(上):文件读写与模块系统(当前篇)
04 Python 进阶(下):异常处理与综合实战
05 C 语言与内存:指针、分配与释放
06 数据结构与算法:链表、栈与队列
07 Git 版本控制:分支、合并与冲突解决
08 Linux 命令行:文件、权限与进程管理

Python 进阶(上):文件读写与模块系统

让数据持久化到文件,用标准库模块扩展能力边界
进阶篇 文件操作 标准库
读完本篇你将能:用 open() 和 with 语句读写文本文件,理解三种文件模式的区别,用 import 导入标准库模块,掌握 os / sys / json / datetime 四个核心库的常用功能,并编写一个 JSON 配置文件管理器。
📑 本文目录
01文件读写基础
02with 语句:自动关闭文件
03文件操作实战:日志记录器
04模块导入机制
05常用标准库速览
06综合实战:JSON 配置管理器
07动手练习

01 文件读写基础

上一篇你写的程序结束后,所有变量都消失了。文件是数据的持久化仓库——程序退出后数据依然在硬盘上。Python 用 open() 函数打开文件,操作完用 close() 关闭。

三种文件模式

模式 名称 行为 文件不存在时
"r" 只读 读取文件内容 报错 FileNotFoundError
"w" 只写 覆盖写入(清空原内容) 创建新文件
"a" 追加 在文件末尾追加内容 创建新文件

写入文件

write_demo.py
f = open("devices.txt", "w")
f.write("macOS\n")
f.write("Termux\n")
f.write("树莓派\n")
f.close()
# 运行后当前目录生成 devices.txt

读取文件

read_demo.py
f = open("devices.txt", "r")
content = f.read()
f.close()
print(content)
# 输出:
macOS
Termux
树莓派

read() 一次读完整个文件。如果文件很大,用 readline() 逐行读或 readlines() 读成列表。注意 \n 是换行符,write() 不会自动加换行,需要手动写 \n。

⚠️ 常见错误
f = open("not_exist.txt", "r") — 用 "r" 模式打开不存在的文件,直接报 FileNotFoundError
✓ 正确:读取前先检查文件是否存在(下一节 with + os.path 会有更好的方案),或用 "a" 模式(不存在则创建)

02 with 语句:自动关闭文件

上一节的代码有个隐患:如果 write() 和 close() 之间程序出错(比如磁盘满了),文件永远不会被关闭,数据可能丢失。with 语句解决这个问题——无论是否出错,退出 with 块时文件自动关闭。

with_vs_manual.py
1
2
3
4
5
6
7
8
9
# ❌ 手动关闭(有隐患)
f = open("log.txt", "w")
f.write("启动服务\n")
f.close()  # 如果上面出错,这行不执行
# ✅ with 语句(推荐写法)
with open("log.txt", "w") as f:
    f.write("启动服务\n")
# 退出 with 块后文件自动关闭,无论是否出错
💡 小贴士
以后写文件操作一律用 with open(...) as f,不要再手动调用 close()。这不是建议,是 Python 社区的最佳实践——官方文档所有文件操作示例都使用 with。

03 文件操作实战:日志记录器

把 with 语句和函数组合起来,写一个实用的日志记录器——每次调用函数就往日志文件追加一条记录,带时间戳。这个模式在后端开发中会反复用到。

logger.py
1
2
3
4
5
6
7
8
9
10
11
12
from datetime import datetime
def log(message):
    timestamp = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
    line = f"[{timestamp}] {message}\n"
    with open("server.log", "a") as f:
        f.write(line)
# 调用三次,日志追加到同一文件
log("服务启动")
log("收到请求 from 192.168.1.5")
log("服务停止")

运行后打开 server.log 文件,内容如下:

server.log
[2026-08-09 14:23:01] 服务启动
[2026-08-09 14:23:01] 收到请求 from 192.168.1.5
[2026-08-09 14:23:01] 服务停止

注意第 1 行 from datetime import datetime 用到了模块导入——这正是下一节要讲的内容。日志函数用 "a" 追加模式,每次调用都在文件末尾添加新行,不会覆盖之前的日志。

04 模块导入机制

Python 标准库像一个大工具箱,里面有 200 多个模块,每个模块是一格抽屉。你不需要自己造轮子——导入现成的模块就能用。导入方式有两种,理解它们的区别很重要。

两种导入方式

方式 写法 调用时 适用场景
import import os os.getcwd() 需要用到模块中多个函数
from...import from os import getcwd getcwd() 只用模块中一两个函数
Python
import os
print(os.getcwd())  # 当前工作目录
print(os.listdir("."))  # 列出当前目录文件
from sys import argv
print(argv)  # 命令行参数列表

__name__ == "__main__" 的作用

当你写一个 .py 文件被另一个文件 import 时,文件里的代码会自动执行。 if __name__ == "__main__": 确保某些代码只在直接运行时执行,被 import 时不执行。这是 Python 模块的惯用写法。

tool.py
def greet():
    print("工具加载成功")
if __name__ == "__main__":
    greet()  # 直接运行才执行

05 常用标准库速览

标准库不需要安装,import 就能用。阶段一需要掌握四个核心库,覆盖文件路径、命令行参数、JSON 数据和时间处理——后续项目的基石。

模块 用途 常用函数
os 文件/目录操作 getcwd(), listdir(), path.exists(), mkdir()
sys 系统/解释器信息 argv, exit(), platform
json JSON 读写 load(), dump(), loads(), dumps()
datetime 日期时间 now(), strftime(), strptime()

os 模块:检查文件是否存在

Python
import os
if os.path.exists("server.log"):
    print("日志文件已存在")
else:
    print("日志文件不存在,将创建新文件")

json 模块:读写 JSON 数据

JSON 是前后端通信的标准数据格式。 json.dump() 把 Python 字典写入文件, json.load() 从文件读回字典。

json_demo.py
1
2
3
4
5
6
7
8
9
import json
config = {"host": "192.168.1.100", "port": 8080}
# 写入 JSON 文件
with open("config.json", "w") as f:
    json.dump(config, f, indent=2)
# 生成 config.json,内容是格式化的 JSON

生成的 config.json 文件内容:

config.json
{
  "host": "192.168.1.100",
  "port": 8080
}

06 综合实战:JSON 配置管理器

把文件读写、模块导入、标准库组合起来,写一个配置文件管理器:读取 JSON 配置、修改配置项、保存回文件。这个工具在阶段二的后端开发中会直接复用。

config_manager.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
import json
import os
def load_config(path):
    """读取JSON配置文件,不存在则返回空字典"""
    if not os.path.exists(path):
        return {}
    with open(path, "r") as f:
        return json.load(f)
def save_config(path, config):
    """保存配置到JSON文件"""
    with open(path, "w") as f:
        json.dump(config, f, indent=2)

使用方式:

Python
# 读取配置(首次运行为空字典)
cfg = load_config("app.json")
cfg["device"] = "树莓派"
cfg["port"] = 5000
save_config("app.json", cfg)
# 再次运行 load_config 能读到保存的配置

这个配置管理器展示了三个核心技能的组合:用 os.path.exists() 防止文件不存在报错,用 with open 安全读写,用 json.load/dump 处理结构化数据。下一篇学习异常处理后,还能给 load_config 加上 try/except 处理 JSON 格式错误的情况。

07 动手练习

以下练习在任意一台设备上完成。用 Vim 编辑,用 python3 文件名.py 运行。

🟢 基础验证
用 with open 创建一个 devices.txt 文件,写入三行设备名称(macOS、Termux、树莓派),然后再读取并用 print 输出文件内容。
参考解法:
with open("devices.txt", "w") as f:
    f.write("macOS\nTermux\n树莓派\n")
with open("devices.txt", "r") as f:
    print(f.read())
🟡 组合应用
编写一个日志记录脚本 my_logger.py:定义一个 log(level, message) 函数,用 datetime 模块生成时间戳,将 [时间] [级别] 消息 格式追加到 app.log 文件。调用三次:log("INFO", "启动")、log("WARN", "内存偏高")、log("ERROR", "连接超时"),然后读取文件验证内容。
提示:参考本篇第 03 节的日志记录器,增加 level 参数。时间格式用 datetime.now().strftime("%Y-%m-%d %H:%M:%S")。
🔴 开放挑战
扩展本篇的 JSON 配置管理器,实现一个命令行配置工具 cfg_tool.py:用 sys.argv 接收命令行参数,支持三种操作:python3 cfg_tool.py get 键名(读取配置项)、python3 cfg_tool.py set 键名 值(设置配置项)、python3 cfg_tool.py list(列出所有配置)。要求:配置存在 config.json 中,用 json 模块读写。
参考方向:sys.argv[1] 是操作类型,sys.argv[2] 是键名,sys.argv[3] 是值(set 操作时)。用 if/elif 判断操作类型,每种操作调用 load_config 和 save_config。
📖 知识回顾
open() 三种模式 read / write / readline with 语句 import / from...import __name__ == __main__ os.path.exists() json.load / json.dump datetime.now() sys.argv 日志记录器模式
下篇预告
04 Python 进阶(下):异常处理与综合实战
文件读写和模块已掌握,下一篇学习 try/except 异常捕获机制,处理文件不存在、JSON 格式错误、网络超时等运行时错误,并完成一个综合实战项目。
关注获取全栈开发系列全部文章