第七章 文件操作
第一节 Python文件操作基础
概述
在Python程序设计中,文件操作是不可或缺的重要内容。通过文件操作,程序能够实现数据的持久存储和读取,使得程序不仅可以处理内存中的数据,还能与磁盘上的文件进行交互。本节重点介绍Python中如何进行文件的打开、读写及关闭操作,掌握文件操作的基本流程和相关函数,为后续复杂的文件处理打下坚实基础。
学习目标:
- 理解文件类型及其作用
- 掌握文件的打开模式及其区别
- 熟悉文件的读写方法
- 掌握文件的关闭和异常处理
- 能够编写基本的文件操作程序
核心概念
文件(File):存储在磁盘或其他外部存储介质中,包含数据或信息的集合。文件通常可以是文本文件或二进制文件。
文件路径(File Path):文件在文件系统中的位置。路径可分为绝对路径和相对路径。
文件打开模式(Mode):指定程序如何访问文件,如只读、写入、追加等。
文件对象(File Object):Python中通过open函数返回的对象,代表打开的文件,通过该对象进行文件的读写操作。
缓冲区(Buffer):文件操作时使用的内存区域,用于提高读写效率。
原理分析
Python的文件操作基于操作系统文件系统接口。通过内置函数open()打开文件,返回文件对象后,程序可以调用文件对象的方法进行读写。读写过程通常会先经过缓冲区,以减少磁盘I/O次数,提高效率。文件操作结束后,必须关闭文件,释放系统资源。
文件打开时,Python根据指定的模式(如'r'、'w'、'a'、'rb'、'wb'等)决定文件的打开方式和读写权限。
文件读写是对文件指针位置的控制,读写函数会从当前指针位置开始操作,指针可通过seek()方法移动。
异常处理是文件操作的重要环节,避免因文件不存在、权限不足等问题导致程序崩溃。
详细内容
1. 文件的打开与关闭
open()函数用于打开文件,基本语法如下:
file = open(filename, mode='r', encoding=None)
- filename:文件名或路径字符串
- mode:打开模式,默认只读('r')
- encoding:文本文件编码,常用'utf-8'
常见的打开模式:
| 模式 | 说明 |
|---|---|
| 'r' | 只读,文件必须存在 |
| 'w' | 只写,文件存在则覆盖,不存在则创建 |
| 'a' | 追加写入,文件不存在则创建 |
| 'rb' | 以二进制只读模式打开 |
| 'wb' | 以二进制写入模式打开 |
| 'r+' | 读写模式,文件必须存在 |
打开文件后,必须调用**close()**方法关闭文件释放资源。
file.close()
或者使用with语句,自动管理文件关闭,推荐使用。
with open('data.txt', 'r', encoding='utf-8') as f:
data = f.read()
# 文件自动关闭
2. 文件读取
Python中读取文件常用方法:
- read():读取整个文件内容,返回字符串(文本模式)或字节(二进制模式)
- read(size):读取指定字节数或字符数
- readline():读取一行,包含换行符
- readlines():读取所有行,返回列表,每行为列表元素
示例:
with open('example.txt', 'r', encoding='utf-8') as f:
content = f.read() # 读取全部内容
with open('example.txt', 'r', encoding='utf-8') as f:
line = f.readline() # 读取第一行
with open('example.txt', 'r', encoding='utf-8') as f:
lines = f.readlines() # 读取所有行
读取文件时要注意文件编码,避免出现乱码。
3. 文件写入
写操作会改变文件内容,常用方法:
- write(string):将字符串写入文件
- writelines(list):将字符串列表写入文件,不自动添加换行符
写入示例:
with open('output.txt', 'w', encoding='utf-8') as f:
f.write('Hello, World!\n')
f.writelines(['Line1\n', 'Line2\n'])
注意,使用写模式('w')打开文件会清空原文件内容,追加模式('a')不会。
4. 文件指针与定位
文件读写过程中,文件指针决定当前操作位置。
- tell():返回当前文件指针位置
- seek(offset, whence=0):移动文件指针
参数说明:
| whence | 说明 |
|---|---|
| 0 | 文件开头(默认) |
| 1 | 当前指针位置 |
| 2 | 文件末尾 |
示例:
with open('example.txt', 'r', encoding='utf-8') as f:
f.seek(5) # 移动到第6个字符
data = f.read(10)
5. 异常处理与文件操作安全
文件操作容易出现文件不存在、权限不足等异常。常用try-except结构捕获异常,保证程序健壮性。
示例:
try:
with open('nofile.txt', 'r', encoding='utf-8') as f:
data = f.read()
except FileNotFoundError:
print('文件不存在,请检查路径')
except IOError:
print('文件读写错误')
推荐使用with语句管理文件,避免忘记关闭文件造成资源泄露。
实例分析
实例一:读取文本文件并统计行数
背景:需要统计一个文本文件中的总行数。
with open('test.txt', 'r', encoding='utf-8') as f:
lines = f.readlines()
print('文件行数:', len(lines))
分析:使用readlines()一次性读取所有行,返回列表,列表长度即为行数。
结论:简单高效地实现文件行数统计。
实例二:写入用户输入内容到文件
背景:将用户输入的多行文本保存到文件中。
with open('user_input.txt', 'w', encoding='utf-8') as f:
while True:
line = input('请输入内容(输入exit退出): ')
if line.lower() == 'exit':
break
f.write(line + '\n')
分析:使用写模式打开文件,循环获取用户输入,写入文件,直到输入exit结束。
结论:实现了简单的文本保存功能。
实例三:按指定字节读取二进制文件
背景:读取一个二进制文件的前64字节。
with open('image.jpg', 'rb') as f:
data = f.read(64)
print(data)
分析:以二进制模式打开文件,read()返回字节对象,可用于后续处理。
结论:掌握二进制文件的读取方法。
常见误区
忘记关闭文件
- 错误做法:
f = open('file.txt', 'r') data = f.read() # 忘记调用 f.close() - 正确做法:使用with语句或手动关闭
- 错误做法:
打开模式错误导致文件访问失败
- 尝试以写模式打开不存在的文件时覆盖,或以只读模式打开不存在文件产生异常
读写编码不一致导致乱码
- 打开文本文件时未指定正确编码,导致读取内容乱码
使用readlines()读取大文件导致内存不足
- 大文件不宜一次性全部读入,应逐行读取
写入时没有换行导致内容连成一行
- 使用write()写入多行时,需要手动添加换行符
应用场景
- 配置文件读取:程序启动时读取配置参数文件
- 日志文件写入:记录程序运行信息
- 数据持久化:保存程序运行结果或用户数据
- 文本处理:批量处理文本文件,比如批量替换、格式转换
- 二进制文件操作:处理图片、音频、视频等文件
知识拓展
- 文件与路径操作模块:
os和pathlib模块,管理文件路径、判断文件是否存在 - 文件指针高级操作:结合seek()实现文件随机访问
- CSV文件操作:使用
csv模块处理表格数据 - JSON文件读写:使用
json模块读写结构化数据 - 异常处理进阶:使用自定义异常和finally语句保证文件关闭
总结回顾
本节内容系统讲解了Python中文件操作的基础知识,包括文件的打开、读取、写入和关闭,以及文件指针和异常处理。通过实例演示了文件操作的具体应用,指出了常见误区并给出正确做法。掌握这些内容是理解和使用Python进行数据持久化和文件处理的基础,为后续学习更复杂的文件操作和数据处理打下坚实基础。