课程 16:文件操作(File I/O)
1. 文件操作基础
1.1 什么是文件操作?
定义: 文件操作是指对磁盘上的文件进行读取和写入,常用于数据持久化、日志记录、数据交换等。
# 文件路径可以是相对路径或绝对路径
# 常见模式:'r' 只读,'w' 写入(覆盖),'a' 追加,'b' 二进制
1.2 打开与关闭文件
# 打开文件(推荐使用with自动关闭文件)
with open('data.txt', 'r', encoding='utf-8') as f:
# 文件操作
pass
# 传统方式
f = open('data.txt', 'r', encoding='utf-8')
f.close()
常用模式:
• 'r' 只读
• 'w' 写入(覆盖)
• 'a' 追加写入
• 'b' 二进制模式(如 'rb', 'wb')
2. 文件读取操作
2.1 读取全部内容
with open('data.txt', 'r', encoding='utf-8') as f:
content = f.read()
print(content)
2.2 逐行读取
with open('data.txt', 'r', encoding='utf-8') as f:
for line in f:
print(line.strip())
2.3 读取部分内容
with open('data.txt', 'r', encoding='utf-8') as f:
first10 = f.read(10) # 读取前10个字符
print(first10)
常用方法:
• read() 读取全部
• readline() 读取一行
• readlines() 读取所有行为列表
with open('data.txt', 'r', encoding='utf-8') as f:
lines = f.readlines()
print(lines)
3. 文件写入操作
3.1 覆盖写入
with open('output.txt', 'w', encoding='utf-8') as f:
f.write('Hello, world!\n')
3.2 追加写入
with open('output.txt', 'a', encoding='utf-8') as f:
f.write('追加内容\n')
3.3 写入多行
lines = ['第一行\n', '第二行\n', '第三行\n']
with open('output.txt', 'w', encoding='utf-8') as f:
f.writelines(lines)
注意: writelines() 不会自动加换行符,需手动添加。
3.4 JSON 读写
常用API:
• json.dump(obj, fp, ensure_ascii=False, indent=2):将对象写入JSON文件
• json.load(fp):从JSON文件读取为Python对象
• json.dumps(obj, ensure_ascii=False, indent=2):对象转JSON字符串
• json.loads(s):JSON字符串转对象
import json
# 写入 JSON 文件(推荐:ensure_ascii=False 保留中文,indent 美化)
data = {
'name': '小明',
'age': 18,
'scores': [95, 88, 92],
'active': True
}
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:
loaded = json.load(f)
print(loaded)
# 在内存中进行 JSON 与字符串互转
json_str = json.dumps(data, ensure_ascii=False, indent=2)
print(json_str)
parsed = json.loads(json_str)
print(parsed['name'])
# 序列化非内置类型(示例:将无法序列化对象用 str 处理)
from datetime import datetime
payload = { 'time': datetime(2025, 1, 1, 8, 0, 0) }
json_str_safe = json.dumps(payload, default=str)
print(json_str_safe) # {"time": "2025-01-01 08:00:00"}
4. 二进制文件操作
4.1 读取与写入二进制文件
# 读取图片、音频等二进制文件
with open('image.png', 'rb') as f:
data = f.read()
# 写入二进制文件
with open('copy.png', 'wb') as f:
f.write(data)
常见应用:
• 图片、音频、视频、压缩包等文件的读写
5. 文件操作的常见错误与调试
- 文件路径错误或文件不存在会抛出
FileNotFoundError
- 写入只读文件会抛出
PermissionError
- 操作完文件后未关闭,可能导致数据未保存
- 编码不一致可能导致
UnicodeDecodeError
try:
with open('nofile.txt', 'r', encoding='utf-8') as f:
content = f.read()
except FileNotFoundError:
print('文件不存在!')
6. 实际应用案例
6.1 日志记录
def log_message(msg):
with open('log.txt', 'a', encoding='utf-8') as f:
f.write(msg + '\n')
log_message('程序启动')
6.2 数据持久化
# 保存和读取用户分数
score = 95
with open('score.txt', 'w', encoding='utf-8') as f:
f.write(str(score))
with open('score.txt', 'r', encoding='utf-8') as f:
saved_score = int(f.read())
print(saved_score)
6.3 文本文件批量处理
# 统计文本文件的行数和单词数
def count_file(filename):
lines = 0
words = 0
with open(filename, 'r', encoding='utf-8') as f:
for line in f:
lines += 1
words += len(line.split())
return lines, words
print(count_file('data.txt'))
学习建议:文件操作是Python编程中非常实用的技能,建议多动手实践,理解文件I/O的各种模式和常见错误,遇到问题要学会查文档和调试。
思考题:文件操作时如何保证数据安全?如何处理大文件的读取和写入?在实际开发中,如何选择文本文件和二进制文件?