Appearance
Python 文件操作(File)
在 Python 中,文件操作是一项基本但重要的功能。本章节将详细介绍 Python 中的文件操作,包括文件的打开、读取、写入、关闭以及其他常用的文件操作方法。
文件操作的基本流程
Python 中文件操作的基本流程如下:
- 打开文件:使用
open()函数打开文件,获取文件对象 - 操作文件:对文件进行读取或写入操作
- 关闭文件:使用
close()方法关闭文件,释放系统资源
文件的打开
open() 函数
open() 函数用于打开文件,返回一个文件对象。
语法:
python
open(file, mode='r', buffering=-1, encoding=None, errors=None, newline=None, closefd=True, opener=None)参数说明:
file:文件路径(字符串)mode:打开模式(字符串)buffering:缓冲策略encoding:编码方式(如 'utf-8')errors:编码错误处理方式newline:换行符处理方式closefd:是否关闭文件描述符opener:自定义打开器
文件打开模式
| 模式 | 描述 |
|---|---|
'r' | 只读模式(默认) |
'w' | 写入模式,会覆盖原有内容 |
'a' | 追加模式,在文件末尾添加内容 |
'x' | 独占创建模式,文件不存在时创建 |
'b' | 二进制模式 |
't' | 文本模式(默认) |
'+' | 读写模式 |
常见的模式组合
| 模式 | 描述 |
|---|---|
'r' 或 'rt' | 只读文本模式 |
'w' 或 'wt' | 写入文本模式 |
'a' 或 'at' | 追加文本模式 |
'rb' | 只读二进制模式 |
'wb' | 写入二进制模式 |
'ab' | 追加二进制模式 |
'r+' | 读写文本模式 |
'w+' | 读写文本模式(会覆盖原有内容) |
'a+' | 读写文本模式(在文件末尾添加内容) |
文件的关闭
close() 方法
文件操作完成后,应该使用 close() 方法关闭文件,释放系统资源。
语法:
python
file.close()使用 with 语句
with 语句可以自动管理文件的关闭,即使发生异常也会正确关闭文件。
语法:
python
with open(file, mode) as f:
# 操作文件
# 退出 with 块时,文件会自动关闭文件的读取
read() 方法
read() 方法用于读取文件内容,返回一个字符串。
语法:
python
file.read(size=-1)参数说明:
size:读取的字节数,默认为 -1(读取整个文件)
示例:
python
# 读取整个文件
with open('example.txt', 'r', encoding='utf-8') as f:
content = f.read()
print(content)
# 读取指定字节
with open('example.txt', 'r', encoding='utf-8') as f:
content = f.read(10) # 读取前 10 个字符
print(content)readline() 方法
readline() 方法用于逐行读取文件内容,返回一行字符串。
语法:
python
file.readline(size=-1)参数说明:
size:读取的字节数,默认为 -1(读取整行)
示例:
python
# 逐行读取
with open('example.txt', 'r', encoding='utf-8') as f:
line = f.readline()
while line:
print(line.strip())
line = f.readline()readlines() 方法
readlines() 方法用于读取所有行,返回一个列表,每个元素是一行字符串。
语法:
python
file.readlines(hint=-1)参数说明:
hint:读取的字节数,默认为 -1(读取所有行)
示例:
python
# 读取所有行
with open('example.txt', 'r', encoding='utf-8') as f:
lines = f.readlines()
for line in lines:
print(line.strip())迭代文件对象
文件对象是可迭代的,可以直接在 for 循环中使用。
示例:
python
# 迭代文件对象
with open('example.txt', 'r', encoding='utf-8') as f:
for line in f:
print(line.strip())文件的写入
write() 方法
write() 方法用于向文件写入内容,返回写入的字符数。
语法:
python
file.write(string)参数说明:
string:要写入的字符串
示例:
python
# 写入字符串
with open('example.txt', 'w', encoding='utf-8') as f:
count = f.write('Hello, World!\n')
print(f'写入了 {count} 个字符')
f.write('This is a test.\n')writelines() 方法
writelines() 方法用于向文件写入多行内容,接受一个字符串列表。
语法:
python
file.writelines(lines)参数说明:
lines:字符串列表
示例:
python
# 写入多行
lines = ['Line 1\n', 'Line 2\n', 'Line 3\n']
with open('example.txt', 'w', encoding='utf-8') as f:
f.writelines(lines)文件指针操作
文件指针用于标记当前读写位置。
tell() 方法
tell() 方法用于获取当前文件指针的位置。
语法:
python
file.tell()示例:
python
# 获取文件指针位置
with open('example.txt', 'r', encoding='utf-8') as f:
print(f'初始位置: {f.tell()}')
content = f.read(10)
print(f'读取后位置: {f.tell()}')
print(f'读取的内容: {content}')seek() 方法
seek() 方法用于移动文件指针到指定位置。
语法:
python
file.seek(offset, whence=0)参数说明:
offset:偏移量whence:基准位置(0:文件开头,1:当前位置,2:文件末尾)
示例:
python
# 移动文件指针
with open('example.txt', 'r', encoding='utf-8') as f:
# 读取前 10 个字符
content1 = f.read(10)
print(f'读取的内容 1: {content1}')
print(f'当前位置: {f.tell()}')
# 移动到文件开头
f.seek(0)
print(f'移动到开头后位置: {f.tell()}')
# 再次读取前 10 个字符
content2 = f.read(10)
print(f'读取的内容 2: {content2}')
# 移动到文件末尾
f.seek(0, 2)
print(f'移动到末尾后位置: {f.tell()}')二进制文件操作
读取二进制文件
python
# 读取二进制文件
with open('example.bin', 'rb') as f:
content = f.read()
print(content)写入二进制文件
python
# 写入二进制文件
data = b'Hello, Binary!'
with open('example.bin', 'wb') as f:
f.write(data)文件操作的异常处理
在文件操作中,可能会遇到各种异常,如文件不存在、权限不足等。我们应该使用异常处理来捕获这些异常。
示例:
python
# 文件操作的异常处理
try:
with open('nonexistent.txt', 'r', encoding='utf-8') as f:
content = f.read()
print(content)
except FileNotFoundError:
print('错误:文件不存在')
except PermissionError:
print('错误:权限不足')
except Exception as e:
print(f'错误:{e}')文件对象的属性和方法
文件对象的属性
| 属性 | 描述 |
|---|---|
name | 文件名称 |
mode | 文件打开模式 |
closed | 文件是否已关闭 |
示例:
python
# 文件对象的属性
with open('example.txt', 'r', encoding='utf-8') as f:
print(f'文件名称: {f.name}')
print(f'文件模式: {f.mode}')
print(f'文件是否关闭: {f.closed}')
print(f'文件是否关闭: {f.closed}') # 退出 with 块后文件对象的方法
| 方法 | 描述 |
|---|---|
close() | 关闭文件 |
read(size=-1) | 读取文件内容 |
readline(size=-1) | 读取一行内容 |
readlines(hint=-1) | 读取所有行 |
write(string) | 写入内容 |
writelines(lines) | 写入多行 |
tell() | 获取文件指针位置 |
seek(offset, whence=0) | 移动文件指针 |
flush() | 刷新缓冲区 |
truncate(size=None) | 截断文件 |
示例:
python
# 文件对象的方法
with open('example.txt', 'w+', encoding='utf-8') as f:
# 写入内容
f.write('Hello, World!\nThis is a test.\n')
# 刷新缓冲区
f.flush()
# 移动到文件开头
f.seek(0)
# 读取内容
content = f.read()
print(f'读取的内容:\n{content}')
# 截断文件
f.truncate(10)
# 移动到文件开头
f.seek(0)
# 读取截断后的内容
truncated_content = f.read()
print(f'截断后的内容:\n{truncated_content}')实际应用示例
示例 1:复制文件
python
# 复制文件
def copy_file(src, dst):
"""复制文件"""
try:
with open(src, 'rb') as fsrc:
with open(dst, 'wb') as fdst:
while True:
# 分块读取,避免大文件占用过多内存
data = fsrc.read(1024 * 1024) # 1MB 块
if not data:
break
fdst.write(data)
print(f'文件 {src} 已复制到 {dst}')
except Exception as e:
print(f'复制文件失败: {e}')
# 测试
copy_file('example.txt', 'example_copy.txt')示例 2:统计文件行数
python
# 统计文件行数
def count_lines(filename):
"""统计文件行数"""
try:
with open(filename, 'r', encoding='utf-8') as f:
line_count = 0
for line in f:
line_count += 1
print(f'文件 {filename} 有 {line_count} 行')
return line_count
except Exception as e:
print(f'统计行数失败: {e}')
return 0
# 测试
count_lines('example.txt')示例 3:查找文件中的关键字
python
# 查找文件中的关键字
def search_in_file(filename, keyword):
"""查找文件中的关键字"""
try:
with open(filename, 'r', encoding='utf-8') as f:
line_number = 0
matches = []
for line in f:
line_number += 1
if keyword in line:
matches.append((line_number, line.strip()))
if matches:
print(f'在文件 {filename} 中找到 {len(matches)} 个 "{keyword}" 的匹配:')
for line_num, line_content in matches:
print(f'第 {line_num} 行: {line_content}')
else:
print(f'在文件 {filename} 中未找到 "{keyword}"')
return matches
except Exception as e:
print(f'查找失败: {e}')
return []
# 测试
search_in_file('example.txt', 'test')示例 4:读取 CSV 文件
python
# 读取 CSV 文件
def read_csv(filename):
"""读取 CSV 文件"""
try:
with open(filename, 'r', encoding='utf-8') as f:
headers = f.readline().strip().split(',')
rows = []
for line in f:
values = line.strip().split(',')
row = dict(zip(headers, values))
rows.append(row)
print(f'读取了 {len(rows)} 行数据')
return headers, rows
except Exception as e:
print(f'读取 CSV 文件失败: {e}')
return [], []
# 测试
headers, rows = read_csv('data.csv')
print(f'表头: {headers}')
print(f'数据: {rows}')示例 5:写入 CSV 文件
python
# 写入 CSV 文件
def write_csv(filename, headers, rows):
"""写入 CSV 文件"""
try:
with open(filename, 'w', encoding='utf-8') as f:
# 写入表头
f.write(','.join(headers) + '\n')
# 写入数据
for row in rows:
values = [str(row.get(header, '')) for header in headers]
f.write(','.join(values) + '\n')
print(f'数据已写入 {filename}')
except Exception as e:
print(f'写入 CSV 文件失败: {e}')
# 测试
headers = ['name', 'age', 'city']
rows = [
{'name': 'Alice', 'age': 30, 'city': 'New York'},
{'name': 'Bob', 'age': 25, 'city': 'London'},
{'name': 'Charlie', 'age': 35, 'city': 'Paris'}
]
write_csv('output.csv', headers, rows)总结
Python 中的文件操作是一项基本但重要的功能,本章节介绍了:
- 文件操作的基本流程:打开文件 → 操作文件 → 关闭文件
- 文件的打开:
open()函数及其参数 - 文件的关闭:
close()方法和with语句 - 文件的读取:
read()、readline()、readlines()方法和迭代文件对象 - 文件的写入:
write()和writelines()方法 - 文件指针操作:
tell()和seek()方法 - 二进制文件操作:以二进制模式打开和操作文件
- 文件操作的异常处理:捕获和处理文件操作中的异常
- 文件对象的属性和方法:文件对象的各种属性和方法
- 实际应用示例:复制文件、统计文件行数、查找关键字、读写 CSV 文件
掌握这些文件操作技巧,对于处理各种文件相关任务非常重要。在实际应用中,我们应该根据具体需求选择合适的文件操作方法,并注意异常处理和资源管理。