文件读写
open/read/write、with 自动关闭、文本/二进制模式、编码
文件操作
Python 可以很方便地读写磁盘上的文件。从日志记录到数据处理,文件操作无处不在。
学完本章你将掌握: 打开/关闭文件、读取方式、写入模式、with 语句、路径处理。
一、打开和关闭文件
python
# 打开文件
f = open("test.txt", "w", encoding="utf-8")
f.write("Hello, Python!\n")
f.write("第二行内容")
f.close() # 必须关闭!
⚠️ 忘记 close() 会导致数据丢失和资源泄漏。 更推荐下面的
with语句。
二、with 语句(推荐)
python
# with 自动关闭文件,即使发生异常也会关闭
with open("test.txt", "w", encoding="utf-8") as f:
f.write("Hello, Python!\n")
f.write("第二行内容")
# 缩进结束后文件自动关闭
三、文件模式
| 模式 | 含义 | 文件不存在时 |
|---|---|---|
| `r` | 只读 | 报错 |
| `w` | 写入(覆盖) | 创建新文件 |
| `a` | 追加(不覆盖) | 创建新文件 |
| `r+` | 读写 | 报错 |
| `x` | 创建并写入 | 报错(文件已存在时) |
python
# 写入模式:覆盖原内容
with open("data.txt", "w", encoding="utf-8") as f:
f.write("这是新内容\n") # 原有内容被清空
# 追加模式:添加在末尾
with open("data.txt", "a", encoding="utf-8") as f:
f.write("这是追加的内容\n")
四、读取文件
python
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(f"行内容: {line.strip()}")
with open("test.txt", "r", encoding="utf-8") as f:
# readlines():一次性读所有行到列表
lines = f.readlines()
print(f"共 {len(lines)} 行")
with open("test.txt", "r", encoding="utf-8") as f:
# 读指定字节数
chunk = f.read(10)
print(chunk)
💡 大文件用逐行读取:
for line in f是流式读取,不会一次性把整个文件加载到内存。处理 GB 级文件时这点很重要。
五、写入文件
python
# write() 写入字符串
with open("output.txt", "w", encoding="utf-8") as f:
f.write("第一行\n")
f.write("第二行\n")
# writelines() 写入多行
lines = ["行1\n", "行2\n", "行3\n"]
with open("output.txt", "w", encoding="utf-8") as f:
f.writelines(lines)
六、文件路径处理
python
import os
# 检查文件是否存在
print(os.path.exists("test.txt")) # True/False
print(os.path.isfile("test.txt")) # 是文件吗
print(os.path.isdir("mydir")) # 是目录吗
# 路径拼接(跨平台)
path = os.path.join("data", "2024", "report.txt")
print(path) # data/2024/report.txt(Linux)或 data\2024\report.txt(Windows)
# 获取文件信息
print(os.path.getsize("test.txt")) # 文件大小(字节)
print(os.path.basename("/a/b/c.txt")) # c.txt(文件名)
print(os.path.dirname("/a/b/c.txt")) # /a/b(目录路径)
七、CSV 文件读写
python
import csv
# 写入 CSV
with open("users.csv", "w", newline="", encoding="utf-8") as f:
writer = csv.writer(f)
writer.writerow(["姓名", "年龄", "城市"]) # 表头
writer.writerow(["小明", 20, "北京"])
writer.writerow(["小红", 22, "上海"])
# 读取 CSV
with open("users.csv", "r", encoding="utf-8") as f:
reader = csv.reader(f)
for row in reader:
print(row)
八、实战:日志记录器
python
import datetime
def write_log(message):
timestamp = datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S")
with open("app.log", "a", encoding="utf-8") as f:
f.write(f"[{timestamp}] {message}\n")
write_log("程序启动")
write_log("用户登录: 小明")
write_log("处理完成")
小结
- 用
with open(...) as f自动管理文件关闭 - 三种常用模式:
r(读)、w(写)、a(追加) - 大文件用
for line in f逐行读取,省内存 os.path处理路径,跨平台兼容csv模块处理表格数据
小练习
- 写一个程序,把 1 到 10 的平方写入
squares.txt,每行一个 - 读回这个文件,计算所有平方数的和
- 写一个函数
count_lines(filename)返回文件的行数
💬 下一章预告:学完文件操作,下一章学习类与对象——面向对象编程的核心概念。