【Python语言基础】23、文件处理
文章目录
- 1. 文件处理
- 1.1 基本步骤
- 1.2 打开文件
- 1.3 读取文件
- 1.4 写入文件
- 1.5 使用with语句
- 2. 二进制文件操作
- 3. 文件指针操作
- 4.读取大文件
- 4.1 逐行读取
- 4.2 按固定字节数读取
- 4.3 使用生成器函数
- 5. 异常处理
在 Python 里,文件操作是一项极为常用的功能,借助它能够对文件进行读取、写入、修改等操作
1. 文件处理
1.1 基本步骤
通常,文件操作包含以下几个基本步骤:
- 打开文件:使用 open() 函数打开指定的文件,获取文件对象。
- 操作文件:对文件对象进行读取、写入等操作。
- 关闭文件:使用 close() 方法关闭文件,释放系统资源
1.2 打开文件
在 Python 中,使用 open() 函数来打开文件,其基本语法如下:
file = open(file_path, mode)
-
file_path:文件的路径,可以是相对路径或绝对路径。
-
mode:文件的打开模式,常见的模式有:
- ‘r’:只读模式,默认值。用于读取文件内容,如果文件不存在会抛出 FileNotFoundError 异常。
- ‘w’:写入模式,用于创建新文件或覆盖原有文件内容。如果文件不存在,会创建新文件;如果文件已存在,会清空原有内容。
- ‘a’:追加模式,用于在文件末尾追加内容。如果文件不存在,会创建新文件。
- ‘b’:二进制模式,可与其他模式结合使用,如 ‘rb’ 表示以二进制只读模式打开文件。
- ‘+’:读写模式,可与其他模式结合使用,如 ‘r+’ 表示以读写模式打开文件。
1.3 读取文件
打开文件后,可以使用以下方法读取文件内容:
- read() 方法
读取整个文件内容,返回一个字符串
# 以只读模式打开文件
file = open('example.txt', 'r')
# 读取整个文件内容
content = file.read()
print(content)
# 关闭文件
file.close()
- readlines() 方法
读取文件中的所有行,返回一个包含每行内容的列表
file = open('example.txt', 'r')
lines = file.readlines()
for line in lines:print(line)
file.close()
1.4 写入文件
使用 write() 方法可以向文件中写入内容:
# 以写入模式打开文件
file = open('example.txt', 'w')
# 写入内容
file.write('Hello, World!\n')
file.write('This is a test file.\n')
# 关闭文件
file.close()
在写入模式下,如果文件已存在,原有内容会被覆盖。如果需要追加内容,可以使用追加模式 ‘a’:
# 以追加模式打开文件
file = open('example.txt', 'a')
# 追加内容
file.write('This is additional content.\n')
# 关闭文件
file.close()
1.5 使用with语句
为了避免忘记关闭文件,可以使用 with 语句,它会在代码块执行完毕后自动关闭文件:
# 使用 with 语句打开文件
with open('example.txt', 'r') as file:content = file.read()print(content)
# 文件会自动关闭
2. 二进制文件操作
对于二进制文件,如图片、视频等,需要使用二进制模式进行操作。例如,复制一张图片:
# 以二进制只读模式打开源文件
with open('source.jpg', 'rb') as source_file:# 以二进制写入模式打开目标文件with open('destination.jpg', 'wb') as destination_file:# 读取源文件内容content = source_file.read()# 写入目标文件destination_file.write(content)
3. 文件指针操作
在文件操作过程中,文件指针会记录当前的读写位置。可以使用以下方法操作文件指针:
- seek(offset, whence) 方法:移动文件指针的位置。
- offset:偏移量,正数表示向后移动,负数表示向前移动。
- whence:参考位置,可选值为:
- 0:从文件开头开始计算偏移量,默认值。
- 1:从当前位置开始计算偏移量。
- 2:从文件末尾开始计算偏移量。
with open('example.txt', 'r') as file:# 读取前 5 个字符first_five = file.read(5)print(first_five)# 将文件指针移动到文件开头file.seek(0)# 再次读取前 5 个字符first_five_again = file.read(5)print(first_five_again)
- tell() : 返回文件对象当前的文件指针位置,单位是字节。文件指针就像是你看书时书签所在的位置,它标记着你当前读到了哪里。
# 以只读模式打开文件
file = open('test.txt', 'r')
# 读取前 5 个字符
file.read(5)
# 获取当前文件指针的位置
position = file.tell()
print(f"当前文件指针位置是: {position} 字节")
# 关闭文件
file.close()
4.读取大文件
当使用 Python 读取大文件时,由于文件过大,一次性将整个文件内容加载到内存中会导致内存占用过高,甚至引发内存溢出错误。因此,需要采用一些特殊的策略来处理大文件。
以下是几种常见的方法:
4.1 逐行读取
逐行读取是最常用的方法,它每次只读取文件的一行内容,处理完一行后再读取下一行,这样可以显著减少内存的使用。
# 打开大文件,使用 'r' 模式表示以只读文本模式打开
with open('large_file.txt', 'r', encoding='utf-8') as file:# 遍历文件的每一行for line in file:# 对每一行进行处理,这里只是简单打印,你可以根据需求修改print(line.strip())
说明:
- with open(‘large_file.txt’, ‘r’, encoding=‘utf-8’) as file:使用 with 语句打开文件,这样可以确保文件在使用完后自动关闭。‘r’ 表示只读模式,encoding=‘utf-8’ 用于指定文件的编码格式。
- for line in file:这是一个迭代器,会逐行读取文件内容。
- print(line.strip()):对读取的每一行进行处理,这里使用 strip() 方法去除行首尾的空白字符并打印,你可以根据实际需求对每一行进行其他操作。
4.2 按固定字节数读取
如果逐行读取不满足需求,也可以按固定的字节数读取文件内容。
# 以二进制只读模式打开文件
with open('large_file.txt', 'rb') as file:# 每次读取 1024 字节(即 1KB)的数据while True:chunk = file.read(1024)if not chunk:# 如果读取到文件末尾(读取内容为空),则退出循环break# 对读取的字节块进行处理,这里只是简单打印,你可以根据需求修改print(chunk.decode('utf-8').strip())
说明:
- with open(‘large_file.txt’, ‘rb’) as file:以二进制只读模式(‘rb’)打开文件。
- while True:使用无限循环不断读取文件内容。
- chunk = file.read(1024):每次读取 1024 字节的数据。
- if not chunk: break:如果读取到的内容为空,说明已经到达文件末尾,退出循环。
- print(chunk.decode(‘utf-8’).strip()):将读取的字节数据解码为字符串(假设文件编码为 UTF-8),去除首尾空白字符并打印,你可以根据实际需求对数据进行其他操作。
4.3 使用生成器函数
可以定义一个生成器函数来读取文件,这样可以将读取和处理逻辑分离,使代码更具模块化。
def read_large_file(file_path, chunk_size=1024):# 以二进制只读模式打开文件with open(file_path, 'rb') as file:while True:# 每次读取指定字节数的数据chunk = file.read(chunk_size)if not chunk:# 如果读取到文件末尾,则退出循环break# 使用 yield 关键字将读取的字节块作为生成器的一个元素返回yield chunk# 调用生成器函数并处理文件内容
for chunk in read_large_file('large_file.txt'):print(chunk.decode('utf-8').strip())
说明:
- def read_large_file(file_path, chunk_size=1024):定义一个生成器函数,接收文件路径和每次读取的字节数作为参数。
- yield chunk:使用 yield 关键字将读取的字节块作为生成器的一个元素返回,这样可以实现按需读取。
- for chunk in read_large_file(‘large_file.txt’):调用生成器函数并遍历生成器,对每个字节块进行处理。
通过以上方法,可以在 Python 中高效地读取大文件,避免内存问题。选择哪种方法取决于文件的特点和具体的处理需求。
5. 异常处理
在进行文件操作时,可能会出现各种异常,如文件不存在、权限不足等。
可以使用 try-except 语句进行异常处理:
try:with open('nonexistent_file.txt', 'r') as file:content = file.read()print(content)
except FileNotFoundError:print('文件未找到!')
except PermissionError:print('没有权限访问该文件!')