📚 全栈开发学习系列
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 格式错误、网络超时等运行时错误,并完成一个综合实战项目。