🐍 Python 文件操作完全指南

核心知识点速查 · 从入门到精通

← 返回首页
📂 文件打开 — open() 函数

Python 通过内置的 open() 函数打开文件,返回一个文件对象,所有后续操作都通过这个对象进行。

基本语法:

open(file, mode='r', encoding=None)
file文件路径(字符串)
mode打开模式(见下表)
encoding编码方式,推荐 'utf-8'

打开模式速查:

模式含义文件不存在文件存在
'r'只读(默认)❌ 报错✅ 从头读
'w'覆盖写✅ 创建⚠️ 清空后写
'a'追加写✅ 创建✅ 末尾追加
'x'独占创建✅ 创建❌ 报错
'r+'读写❌ 报错✅ 从头读写
'b'二进制配合以上模式:'rb' 'wb' 'ab'
💡 总是显式指定 encoding='utf-8',避免跨平台编码问题。
📖 读取文件的四种方式
方法行为返回值
.read()读取全部内容字符串
.read(n)读取 n 个字符字符串
.readline()读取一行(含换行符)字符串
.readlines()读取所有行列表(每行一个元素)
处理大文件时,用 for line in f: 逐行迭代,避免一次性加载到内存。

推荐写法:

with open('file.txt', 'r', encoding='utf-8') as f:
    for line in f:
        print(line.strip())

核心区别:

  • .read() 读完指针在末尾,再读返回空字符串
  • .readline() 包含行尾 ,用 .strip() 去掉
  • .readlines() 返回列表,大文件会撑爆内存
✏️ 写入文件的方法
方法行为返回值
.write(s)写入字符串 s写入的字符数
.writelines(seq)写入字符串序列None
⚠️ writelines() 不会自动加换行符!需要手动在每个元素后加

写模式对比:

模式指针位置行为
'w'文件开头先清空,再写入
'a'文件末尾追加写入,不清空

writelines 正确用法:

items = ['苹果', '香蕉', '橘子']
with open('fruits.txt', 'w', encoding='utf-8') as f:
    f.writelines(item + '
' for item in items)  # ← 手动加 
🔄 with 语句 — 上下文管理器
强烈推荐!with 语句退出时自动调用 close(),即使发生异常也不会忘记关闭文件。
传统写法(不推荐)with 语句(推荐)
f = open('a.txt', 'r')
data = f.read()
f.close() ← 容易忘!
with open('a.txt', 'r') as f:
    data = f.read()
# 自动关闭 ✓

with 基于 上下文管理器协议:进入 → __enter__(),退出 → __exit__()(自动 close)。

# 同时打开多个文件
with open('src.txt', 'r') as src,      open('dst.txt', 'w') as dst:
    dst.write(src.read())
📍 文件指针 — seek() 和 tell()
方法功能
.tell()返回当前指针位置(字节偏移)
.seek(offset, whence)移动指针到指定位置

seek 的 whence 参数:

whence含义示例
0从文件开头(默认)f.seek(0) 回到开头
1从当前位置f.seek(10, 1) 后移10字节
2从文件末尾f.seek(-10, 2) 倒数10字节
⚠️ 中文 UTF-8 下,一个汉字占 3 字节。seek 按字节移动,跳到汉字中间会导致乱码!

典型用法:读完后再读

with open('data.txt', 'r') as f:
    print(f.read())     # 读完,指针在末尾
    f.seek(0)           # 回到开头
    print(f.read())     # 再读一次 ✓
🧩 常见模式与陷阱
场景推荐写法
逐行处理大文件 for line in open('big.txt'):
读取全部内容 content = open('f.txt').read()
安全写入 with open('f.txt', 'w') as f: f.write(data)
追加日志 with open('log.txt', 'a') as f: f.write(msg + ' ')
避免覆盖已有文件 open('f.txt', 'x') — 文件存在则报错
常见错误:writelines 不加换行 → 所有内容挤在一行!
正确:f.writelines(item + ' ' for item in items)

基础用法速查:

# 读取
with open('f.txt', 'r', encoding='utf-8') as f:
    data = f.read()

# 覆盖写入
with open('f.txt', 'w', encoding='utf-8') as f:
    f.write('新内容
')

# 追加写入
with open('f.txt', 'a', encoding='utf-8') as f:
    f.write('新行
')

# 逐行处理
with open('f.txt', 'r', encoding='utf-8') as f:
    for line in f:
        print(line.strip())