📄 16. 文件操作

本章概述

学习 Python 的文件读写操作,包括文本文件和二进制文件。 预计学习时间:50 分钟


16.1 打开文件 open()

基本格式

f = open("文件名", "模式", encoding="编码")
# 操作文件
f.close()  # 一定要关闭!

文件打开模式

模式说明
r只读(默认),文件不存在会报错
w只写,文件不存在就创建,存在就覆盖
a追加,文件不存在就创建,存在就追加到末尾
r+读写,文件不存在会报错
w+读写,文件不存在就创建,存在就覆盖
a+读写追加,文件不存在就创建
rb二进制只读
wb二进制只写
ab二进制追加

文本文件 vs 二进制文件

  • 文本文件:.txt, .py, .json 等,用 r w a 模式
  • 二进制文件:图片、视频、音频等,用 rb wb ab 模式

编码

# 中文文件要指定 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 文件