本文目录导读:

在Python中处理文件读写是基础且重要的技能,下面我将从基础到进阶,系统地介绍各种文件读写方法。
基础文件操作
打开和关闭文件
# 基本方式
file = open('example.txt', 'r', encoding='utf-8')
content = file.read()
file.close() # 必须手动关闭
# 推荐方式:使用with语句(自动关闭文件)
with open('example.txt', 'r', encoding='utf-8') as file:
content = file.read()
# 文件在此处自动关闭
文件打开模式
| 模式 | 说明 |
|---|---|
'r' |
只读(默认) |
'w' |
写入(覆盖已有内容) |
'a' |
追加(在文件末尾添加) |
'x' |
创建新文件(已存在则报错) |
'b' |
二进制模式(如 'rb') |
't' |
文本模式(默认) |
读写模式(如 'r+') |
读取文件内容
三种读取方法
# 方式1:read() - 一次性读取全部内容
with open('example.txt', 'r', encoding='utf-8') as f:
content = f.read()
print(content)
# 方式2:readline() - 逐行读取
with open('example.txt', 'r', encoding='utf-8') as f:
line = f.readline()
while line:
print(line.strip()) # strip()去除换行符
line = f.readline()
# 方式3:readlines() - 读取所有行到列表
with open('example.txt', 'r', encoding='utf-8') as f:
lines = f.readlines()
for line in lines:
print(line.strip())
推荐读取方式
# 最常用的逐行读取方式(内存友好)
with open('example.txt', 'r', encoding='utf-8') as f:
for line in f: # 文件对象是可迭代的
print(line.strip())
# 读取指定字节数
with open('large_file.txt', 'r', encoding='utf-8') as f:
chunk_size = 1024 # 每次读取1KB
while True:
chunk = f.read(chunk_size)
if not chunk: # 读取完毕
break
process(chunk) # 处理数据块
写入文件内容
基本写入
# 写入字符串
with open('output.txt', 'w', encoding='utf-8') as f:
f.write('Hello, World!\n')
f.write('第二行内容\n')
# 写入多行
lines = ['第一行', '第二行', '第三行']
with open('output.txt', 'w', encoding='utf-8') as f:
for line in lines:
f.write(line + '\n')
使用writelines()
# writelines()不会自动添加换行符
lines = ['line1\n', 'line2\n', 'line3\n']
with open('output.txt', 'w', encoding='utf-8') as f:
f.writelines(lines)
# 或者手动添加换行符
lines = ['line1', 'line2', 'line3']
with open('output.txt', 'w', encoding='utf-8') as f:
f.writelines(line + '\n' for line in lines)
实用案例
案例1:文件复制
def copy_file(source, destination):
"""复制文件"""
try:
with open(source, 'rb') as src, open(destination, 'wb') as dst:
for chunk in iter(lambda: src.read(4096), b''):
dst.write(chunk)
print(f"成功从 {source} 复制到 {destination}")
except FileNotFoundError:
print(f"源文件 {source} 不存在")
except PermissionError:
print("权限不足")
# 使用示例
copy_file('source.txt', 'destination.txt')
案例2:日志文件追加
import datetime
def write_log(message, log_file='app.log'):
"""写入日志"""
timestamp = datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S')
with open(log_file, 'a', encoding='utf-8') as f:
f.write(f'[{timestamp}] {message}\n')
# 使用示例
write_log('用户登录成功')
write_log('系统运行正常')
案例3:配置文件读写
import json
# 写入JSON配置文件
config = {
'database': {
'host': 'localhost',
'port': 3306,
'user': 'admin',
'password': 'secret'
},
'debug': True,
'max_connections': 100
}
with open('config.json', 'w', encoding='utf-8') as f:
json.dump(config, f, indent=4, ensure_ascii=False)
# 读取JSON配置文件
with open('config.json', 'r', encoding='utf-8') as f:
loaded_config = json.load(f)
print(loaded_config['database']['host'])
案例4:CSV文件处理
import csv
# 写入CSV
data = [
['姓名', '年龄', '城市'],
['张三', 25, '北京'],
['李四', 30, '上海'],
['王五', 28, '广州']
]
with open('users.csv', 'w', newline='', encoding='utf-8') as f:
writer = csv.writer(f)
writer.writerows(data)
# 读取CSV
with open('users.csv', 'r', encoding='utf-8') as f:
reader = csv.reader(f)
for row in reader:
print(f'{row[0]}: {row[1]}岁, 来自{row[2]}')
案例5:错误处理机制
def safe_read_file(file_path):
"""安全的文件读取函数"""
try:
with open(file_path, 'r', encoding='utf-8') as f:
return f.read()
except FileNotFoundError:
print(f"错误:文件 {file_path} 未找到")
return None
except PermissionError:
print(f"错误:没有权限读取 {file_path}")
return None
except UnicodeDecodeError:
print(f"错误:文件编码不正确,尝试二进制模式")
try:
with open(file_path, 'rb') as f:
return f.read().decode('gbk') # 尝试其他编码
except:
return None
except Exception as e:
print(f"未知错误:{e}")
return None
高级技巧
处理大文件
def process_large_file(file_path, chunk_size=1024*1024):
"""处理大文件时使用迭代器"""
with open(file_path, 'rb') as f:
while True:
chunk = f.read(chunk_size)
if not chunk:
break
yield chunk
# 使用示例
for chunk in process_large_file('large_file.bin'):
# 处理每个chunk
pass
临时文件处理
import tempfile
# 创建临时文件
with tempfile.NamedTemporaryFile(mode='w', delete=False, suffix='.txt') as tmp:
tmp.write('临时数据')
tmp_path = tmp.name
print(f'临时文件创建在: {tmp_path}')
# 读取临时文件
with open(tmp_path, 'r') as f:
print(f.read())
# 最后手动删除
import os
os.unlink(tmp_path)
文件指针操作
with open('example.txt', 'r', encoding='utf-8') as f:
print(f.tell()) # 当前指针位置:0
f.read(5) # 读取5个字符
print(f.tell()) # 当前指针位置:5
f.seek(0) # 回到文件开头
print(f.read(5)) # 重新读取前5个字符
f.seek(10, 0) # 从开头偏移10个字符
f.seek(5, 1) # 从当前位置偏移5个字符
f.seek(-5, 2) # 从文件末尾向前偏移5个字符
最佳实践
- 始终使用
with语句:确保文件自动关闭 - 指定编码:通常使用
utf-8编码 - 处理异常:考虑文件不存在、权限问题等情况
- 使用二进制模式处理非文本文件:如图片、视频等
- 对大文件使用流式处理:避免内存溢出
- 使用上下文管理器:处理需要清理的资源
Python的文件读写操作非常灵活,掌握了这些基础方法后,你可以轻松应对大部分文件处理需求,在实际开发中,建议:
- 优先使用
with语句 - 注意编码问题
- 做好异常处理
- 根据文件大小选择合适的读取方式
这样就能写出健壮、高效的文件处理代码。
版权声明:NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播