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) # ← 手动加
close(),即使发生异常也不会忘记关闭文件。| 传统写法(不推荐) | with 语句(推荐) |
|---|---|
f = open('a.txt', 'r') |
with open('a.txt', 'r') as f: |
with 基于 上下文管理器协议:进入 → __enter__(),退出 → __exit__()(自动 close)。
# 同时打开多个文件
with open('src.txt', 'r') as src, open('dst.txt', 'w') as dst:
dst.write(src.read())
| 方法 | 功能 |
|---|---|
.tell() | 返回当前指针位置(字节偏移) |
.seek(offset, whence) | 移动指针到指定位置 |
seek 的 whence 参数:
| whence | 含义 | 示例 |
|---|---|---|
0 | 从文件开头(默认) | f.seek(0) 回到开头 |
1 | 从当前位置 | f.seek(10, 1) 后移10字节 |
2 | 从文件末尾 | f.seek(-10, 2) 倒数10字节 |
典型用法:读完后再读
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') — 文件存在则报错 |
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())