📄 16. 文件操作
本章概述
学习 Python 的文件读写操作,包括文本文件和二进制文件。 预计学习时间:50 分钟
16.1 打开文件 open()
基本格式
f = open("文件名", "模式", encoding="编码")
# 操作文件
f.close() # 一定要关闭!文件打开模式
| 模式 | 说明 |
|---|---|
r | 只读(默认),文件不存在会报错 |
w | 只写,文件不存在就创建,存在就覆盖 |
a | 追加,文件不存在就创建,存在就追加到末尾 |
r+ | 读写,文件不存在会报错 |
w+ | 读写,文件不存在就创建,存在就覆盖 |
a+ | 读写追加,文件不存在就创建 |
rb | 二进制只读 |
wb | 二进制只写 |
ab | 二进制追加 |
文本文件 vs 二进制文件
- 文本文件:.txt, .py, .json 等,用
rwa模式- 二进制文件:图片、视频、音频等,用
rbwbab模式
编码
# 中文文件要指定 encoding="utf-8"
f = open("test.txt", "r", encoding="utf-8")Windows 注意
Windows 默认编码是 GBK,打开 UTF-8 文件会乱码,一定要指定
encoding="utf-8"。
16.2 读取文件
read() 读取全部
f = open("test.txt", "r", encoding="utf-8")
content = f.read() # 读取全部内容
print(content)
f.close()readline() 读取一行
f = open("test.txt", "r", encoding="utf-8")
line = f.readline() # 读取一行
print(line)
f.close()readlines() 读取所有行
f = open("test.txt", "r", encoding="utf-8")
lines = f.readlines() # 返回列表,每行是一个元素
print(lines)
f.close()遍历文件(推荐)
f = open("test.txt", "r", encoding="utf-8")
for line in f: # 逐行遍历,省内存
print(line.strip()) # strip()去掉换行符
f.close()大文件用遍历
文件很大时,不要用
read()或readlines(),会占用很多内存。 用for line in f:逐行读取更省内存。
16.3 写入文件
write() 写入
f = open("test.txt", "w", encoding="utf-8")
f.write("Hello World\n")
f.write("你好,世界\n")
f.close()注意换行
write()不会自动加换行,需要自己写\n。
writelines() 写入多行
f = open("test.txt", "w", encoding="utf-8")
lines = ["第一行\n", "第二行\n", "第三行\n"]
f.writelines(lines)
f.close()追加模式
f = open("test.txt", "a", encoding="utf-8")
f.write("追加的内容\n")
f.close()16.4 with 语句(推荐)
推荐用法
用
with语句会自动关闭文件,不用手动close(),更安全。
基本用法
with open("test.txt", "r", encoding="utf-8") as f:
content = f.read()
print(content)
# 离开with块后,文件自动关闭为什么要用 with?
- 自动关闭文件,不会忘记
close() - 即使中间出错也会关闭文件
- 代码更简洁
一定要用 with
读写文件都推荐用
with语句,不要用手动open()+close()。
16.5 文件指针
文件读写有一个指针,记录当前读写的位置。
tell() 查看当前位置
with open("test.txt", "r", encoding="utf-8") as f:
print(f.tell()) # 0(开头)
f.read(5)
print(f.tell()) # 5(读了5个字符)seek() 移动指针
with open("test.txt", "r", encoding="utf-8") as f:
f.seek(5) # 移动到第5个字节的位置
content = f.read()
print(content)注意
seek()的单位是字节,不是字符。 UTF-8 中一个中文占 3 个字节,移动时要注意。
16.6 二进制文件操作
图片、视频、音频等用二进制模式。
复制图片
# 读取二进制
with open("image.jpg", "rb") as f:
data = f.read()
# 写入二进制
with open("image_copy.jpg", "wb") as f:
f.write(data)16.7 常用操作
判断文件是否存在
import os
if os.path.exists("test.txt"):
print("文件存在")
else:
print("文件不存在")删除文件
import os
os.remove("test.txt")重命名文件
import os
os.rename("old.txt", "new.txt")获取文件大小
import os
size = os.path.getsize("test.txt")
print(f"文件大小:{size} 字节")16.8 CSV 文件操作
CSV 是逗号分隔的文本文件,常用于存储表格数据。
手动读写 CSV
# 写入 CSV
with open("data.csv", "w", encoding="utf-8") as f:
f.write("姓名,年龄,成绩\n")
f.write("张三,18,90\n")
f.write("李四,19,85\n")
# 读取 CSV
with open("data.csv", "r", encoding="utf-8") as f:
for line in f:
row = line.strip().split(",")
print(row)csv 模块
import csv
# 写入
with open("data.csv", "w", encoding="utf-8", newline="") as f:
writer = csv.writer(f)
writer.writerow(["姓名", "年龄", "成绩"])
writer.writerow(["张三", 18, 90])
writer.writerow(["李四", 19, 85])
# 读取
with open("data.csv", "r", encoding="utf-8") as f:
reader = csv.reader(f)
for row in reader:
print(row)字典方式读写
import csv
# 写入字典
with open("data.csv", "w", encoding="utf-8", newline="") as f:
fieldnames = ["姓名", "年龄", "成绩"]
writer = csv.DictWriter(f, fieldnames=fieldnames)
writer.writeheader()
writer.writerow({"姓名": "张三", "年龄": 18, "成绩": 90})
writer.writerow({"姓名": "李四", "年龄": 19, "成绩": 85})
# 读取为字典
with open("data.csv", "r", encoding="utf-8") as f:
reader = csv.DictReader(f)
for row in reader:
print(row["姓名"], row["年龄"])16.9 JSON 文件操作
JSON 是常用的数据交换格式。
import json
# 写入 JSON
data = {
"name": "张三",
"age": 18,
"hobbies": ["读书", "跑步", "编程"]
}
with open("data.json", "w", encoding="utf-8") as f:
json.dump(data, f, ensure_ascii=False, indent=2)
# 读取 JSON
with open("data.json", "r", encoding="utf-8") as f:
data = json.load(f)
print(data["name"])ensure_ascii=False
不加这个参数,中文会变成
\uXXXX形式,加上才能正常显示中文。
🔗 相关章节
📝 我的笔记
在这里记录你的理解、疑问和练习代码
# 你的练习代码
✅ 本章检查清单
- 掌握 open() 函数和各种打开模式
- 会读取文件(read、readline、readlines、遍历)
- 会写入文件(write、writelines)
- 会使用 with 语句
- 了解文件指针(tell、seek)
- 会操作二进制文件
- 会读写 CSV 文件
- 会读写 JSON 文件