Z
ZHANK
文件与系统

文件读写

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("处理完成")

小结

  1. with open(...) as f 自动管理文件关闭
  2. 三种常用模式:r(读)、w(写)、a(追加)
  3. 大文件用 for line in f 逐行读取,省内存
  4. os.path 处理路径,跨平台兼容
  5. csv 模块处理表格数据

小练习

  1. 写一个程序,把 1 到 10 的平方写入 squares.txt,每行一个
  2. 读回这个文件,计算所有平方数的和
  3. 写一个函数 count_lines(filename) 返回文件的行数

💬 下一章预告:学完文件操作,下一章学习类与对象——面向对象编程的核心概念。