03 Python 进阶(上):文件读写与模块系统(当前篇)04 Python 进阶(下):异常处理与综合实战读完本篇你将能:用 open() 和 with 语句读写文本文件,理解三种文件模式的区别,用 import 导入标准库模块,掌握 os / sys / json / datetime 四个核心库的常用功能,并编写一个 JSON 配置文件管理器。01 文件读写基础
上一篇你写的程序结束后,所有变量都消失了。文件是数据的持久化仓库——程序退出后数据依然在硬盘上。Python 用 open() 函数打开文件,操作完用 close() 关闭。
三种文件模式
写入文件
f = open("devices.txt", "w")读取文件
f = open("devices.txt", "r")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 open("log.txt", "w") as f:# 退出 with 块后文件自动关闭,无论是否出错 |
以后写文件操作一律用 with open(...) as f,不要再手动调用 close()。这不是建议,是 Python 社区的最佳实践——官方文档所有文件操作示例都使用 with。03 文件操作实战:日志记录器
把 with 语句和函数组合起来,写一个实用的日志记录器——每次调用函数就往日志文件追加一条记录,带时间戳。这个模式在后端开发中会反复用到。
| from datetime import datetime timestamp = datetime.now().strftime("%Y-%m-%d %H:%M:%S") line = f"[{timestamp}] {message}\n"withopen("server.log", "a") as f:log("收到请求 from 192.168.1.5") |
运行后打开 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 os | os.getcwd() | |
| from os import getcwd | getcwd() | |
print(os.getcwd()) # 当前工作目录print(os.listdir(".")) # 列出当前目录文件__name__ == "__main__" 的作用
当你写一个 .py 文件被另一个文件 import 时,文件里的代码会自动执行。 if __name__ == "__main__": 确保某些代码只在直接运行时执行,被 import 时不执行。这是 Python 模块的惯用写法。
if __name__ == "__main__":05 常用标准库速览
标准库不需要安装,import 就能用。阶段一需要掌握四个核心库,覆盖文件路径、命令行参数、JSON 数据和时间处理——后续项目的基石。
| | |
|---|
| | getcwd(), listdir(), path.exists(), mkdir() |
| | argv, exit(), platform |
| | load(), dump(), loads(), dumps() |
| | now(), strftime(), strptime() |
os 模块:检查文件是否存在
if os.path.exists("server.log"):json 模块:读写 JSON 数据
JSON 是前后端通信的标准数据格式。 json.dump() 把 Python 字典写入文件, json.load() 从文件读回字典。
| config = {"host": "192.168.1.100", "port": 8080}with open("config.json", "w") as f: json.dump(config, f, indent=2)# 生成 config.json,内容是格式化的 JSON |
生成的 config.json 文件内容:
06 综合实战:JSON 配置管理器
把文件读写、模块导入、标准库组合起来,写一个配置文件管理器:读取 JSON 配置、修改配置项、保存回文件。这个工具在阶段二的后端开发中会直接复用。
| """读取JSON配置文件,不存在则返回空字典"""ifnot os.path.exists(path):withopen(path, "r") as f:def save_config(path, config):withopen(path, "w") as f: json.dump(config, f, indent=2) |
使用方式:
cfg = load_config("app.json")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 / readlinewith 语句import / from...import__name__ == __main__os.path.exists()json.load / json.dumpdatetime.now()sys.argv日志记录器模式04 Python 进阶(下):异常处理与综合实战文件读写和模块已掌握,下一篇学习 try/except 异常捕获机制,处理文件不存在、JSON 格式错误、网络超时等运行时错误,并完成一个综合实战项目。