文件读写:让程序学会"记笔记"
为什么需要文件?
程序运行时,所有数据都存在内存里——这就像你在脑子里默算,算完就忘。如果你想保存结果、读取配置、写日志,就必须跟文件打交道。
文件就是程序的"笔记本"。写入就是记笔记,读取就是翻笔记。
读取文件
第一眼看上去,Python 好像更简洁。但别被表面骗了,两边都有自己的设计哲学:
| Python | Node.js | |
|---|---|---|
| 核心函数 | 内置 open() | 需要引入 fs 模块 |
| 推荐写法 | with open(...) | fs/promises + async/await |
| 自动关闭 | with 语句自动处理 | 同步版不需要,异步版用完即回收 |
写入文件
文件模式速查表
| 模式 | Python | Node.js | 说明 |
|---|---|---|---|
| 读取 | "r" | readFileSync | 只读,文件必须存在 |
| 写入 | "w" | writeFileSync | 覆盖,不存在则创建 |
| 追加 | "a" | appendFileSync | 追加,不存在则创建 |
编码问题是新手的第一个大坑!
Python 3 在 Windows 上默认编码可能是 GBK 而不是 UTF-8,所以读中文文件时会乱码。永远显式指定 encoding="utf-8"。
Node.js 也一样,readFileSync("file.txt") 不传编码参数会返回 Buffer(二进制数据),而不是字符串。记得加 "utf-8"。
Python 的 with 语句 vs JS 的资源管理
Python 的 with 语句是一个非常优雅的设计——它确保文件用完后一定会被关闭,即使中间出了错误:
Python 的
with相当于自带了try/finally,而 Node.js 的readFileSync/writeFileSync本身就是"读完即走"的一次性操作,所以通常不需要手动关闭。两种语言的思路不同,但目的一样:别让文件忘了关。
逐行读取
处理大文件时,一次性读进内存可能会"撑爆"程序。逐行读取是更聪明的做法:
读写 JSON 文件
JSON 文件是最常用的配置和数据存储格式(下一节会详细讲 JSON):
| Python | Node.js | |
|---|---|---|
| 写入 JSON 文件 | json.dump(obj, file) | fs.writeFileSync(path, JSON.stringify(obj)) |
| 读取 JSON 文件 | json.load(file) | JSON.parse(fs.readFileSync(path)) |
| 中文支持 | ensure_ascii=False | 默认支持 |
| 格式化 | indent=2 | JSON.stringify(obj, null, 2) |
Python 写 JSON 时一定要加
ensure_ascii=False,否则中文会被转成\uXXXX形式。别问我是怎么知道的。
路径处理
写文件路径时最怕的就是跨平台兼容——Windows 用 \,Mac/Linux 用 /。好在两种语言都有路径处理工具:
| 操作 | Python (pathlib) | Node.js (path) |
|---|---|---|
| 拼接路径 | Path("a") / "b" | path.join("a", "b") |
| 父目录 | p.parent | path.dirname(p) |
| 文件名 | p.name | path.basename(p) |
| 扩展名 | p.suffix | path.extname(p) |
| 文件是否存在 | p.exists() | fs.existsSync(p) |
问 AI:"Python 的 pathlib 和 os.path 有什么区别?为什么 pathlib 被推荐?"
pathlib 是 Python 3.4 引入的现代路径处理方式,用 / 运算符拼接路径的写法非常优雅。了解它为什么比 os.path.join() 更好用。
实战:读写配置文件
来看一个贴近实际的例子——一个简单的"用户设置"管理器:
动手练习:创建一个"学生成绩管理器",要求:
- 定义一个包含 3 个学生的成绩数据(每人有姓名、语文、数学、英语成绩)
- 将数据保存为 JSON 文件
- 从文件中读取数据
- 计算每个学生的平均分并打印
- 找出总分最高的学生
分别用 Python 和 Node.js 实现,在本地运行测试。如果遇到困难,可以问 AI 要思路提示而不是直接要答案。
小结
| 概念 | Python | Node.js |
|---|---|---|
| 读取文件 | open(f, "r") + with | fs.readFileSync(f, "utf-8") |
| 写入文件 | open(f, "w") + with | fs.writeFileSync(f, data) |
| 追加文件 | open(f, "a") + with | fs.appendFileSync(f, data) |
| 读 JSON | json.load(f) | JSON.parse(fs.readFileSync(f)) |
| 写 JSON | json.dump(obj, f) | fs.writeFileSync(f, JSON.stringify(obj)) |
| 路径拼接 | Path("a") / "b" | path.join("a", "b") |
| 文件存在 | Path(f).exists() | fs.existsSync(f) |
一句话总结:Python 的 with open() 优雅安全,Node.js 的 fs 模块直接明了。无论哪种语言,文件读写都是程序与"持久化世界"沟通的桥梁。记住三件事:指定编码、处理路径、关闭文件(或者让语言帮你关)。