Python文件读写方法详解

1. 文件基础操作

打开文件

使用open()函数,语法:open(file, mode, encoding)

常用模式:

'r':只读(默认)

'w':只写(会覆盖已有内容)

'a':追加(在文件末尾添加)

'b':二进制模式

'+':读写模式

示例:

# 打开文本文件(推荐使用with语句自动关闭)
with open('example.txt', 'r', encoding='utf-8') as file:
    content = file.read()  # 读取整个文件

关闭文件

显式关闭:file.close()

推荐使用with语句自动管理资源

示例:

file = open('data.txt', 'w')
file.write('Hello Python')
file.close()  # 必须显式关闭

2. 文件读取方法

完整读取

read():读取整个文件内容

示例:

with open('poem.txt', 'r', encoding='utf-8') as f:
    full_text = f.read()
    print(full_text)

按行读取

readline():读取单行

readlines():读取所有行到列表

示例:

with open('log.txt', 'r') as f:
    # 逐行读取
    first_line = f.readline()  # 读取第一行
    remaining_lines = f.readlines()  # 读取剩余所有行

高效大文件处理

使用循环逐行读取(内存高效)

示例:

with open('large_file.csv', 'r') as f:
    for line in f:  # 自动逐行迭代
        print(line.strip())  # 去除换行符

3. 文件写入方法

基础写入

write():写入字符串

writelines():写入字符串列表

示例:

data = ["第一行\n", "第二行\n", "第三行\n"]

with open('output.txt', 'w', encoding='utf-8') as f:
    f.write("文件标题\n")  # 写入单行
    f.writelines(data)    # 写入多行列表

追加模式

使用'a'模式在文件末尾添加内容

示例:

with open('log.txt', 'a', encoding='utf-8') as f:
    f.write(f"[{datetime.now()}] 新日志条目\n")

4. 文件指针操作

获取指针位置

tell()返回当前字节位置

示例:

with open('data.bin', 'rb') as f:
    f.read(10)
    position = f.tell()  # 获取当前位置
    print(f"当前指针位置: {position}")

移动指针位置

seek(offset, whence)移动指针

whence参数:

0:文件开头

1:当前位置

2:文件末尾

示例:

with open('data.txt', 'r+b') as f:
    f.seek(5)          # 移动到第6字节
    f.write(b'insert') # 写入二进制数据
    f.seek(-2, 2)      # 从末尾前移2字节
    print(f.read())    # 读取最后2字节

5. 二进制文件操作

二进制读写

使用'rb'或'wb'模式

示例:

# 写入二进制数据
data = bytearray([0x48, 0x65, 0x6C, 0x6C, 0x6F])  # "Hello"的字节码
with open('binary.bin', 'wb') as f:
    f.write(data)

# 读取二进制数据
with open('binary.bin', 'rb') as f:
    binary_data = f.read()
    print(binary_data.hex())  # 输出十六进制表示

结构化二进制数据处理

使用struct模块处理二进制结构

示例:

import struct

# 写入结构化二进制数据
record = b'John Doe' + struct.pack('i', 28)  # 姓名+年龄(整数)
with open('records.bin', 'wb') as f:
    f.write(record)

# 读取结构化数据
with open('records.bin', 'rb') as f:
    name = f.read(8).decode()  # 读取前8字节作为姓名
    age = struct.unpack('i', f.read(4))[0]  # 读取4字节并解包为整数
    print(f"Name: {name}, Age: {age}")

6. 文件系统操作

目录与文件操作

使用ospathlib模块

示例:

import os
from pathlib import Path

# 创建目录
os.makedirs('data/backups', exist_ok=True)

# 检查文件是否存在
file_path = Path('data/info.txt')
if file_path.exists():
    print("文件已存在")
else:
    file_path.touch()  # 创建空文件

# 获取文件信息
print(f"文件大小: {file_path.stat().st_size} 字节")
print(f"最后修改: {file_path.stat().st_mtime}")

文件路径处理

使用pathlib进行跨平台路径操作

示例:

from pathlib import Path

# 构建路径
data_dir = Path('data') / 'reports' / '2023'
data_dir.mkdir(parents=True, exist_ok=True)

# 遍历目录
for file_path in data_dir.glob('*.txt'):
    print(f"找到文本文件: {file_path.name}")

# 获取绝对路径
print(f"绝对路径: {data_dir.resolve()}")

7. 异常处理

常见文件异常

处理FileNotFoundErrorPermissionError

示例:

try:
    with open('protected.txt', 'r', encoding='utf-8') as f:
        print(f.read())
except FileNotFoundError:
    print("错误:文件不存在!")
except PermissionError:
    print("错误:没有文件访问权限!")
except UnicodeDecodeError:
    print("错误:文件编码不匹配!")

8. 总结

Python提供了强大而灵活的文件操作能力,通过open()函数结合不同模式可以满足各种文件处理需求。使用with语句可以自动管理资源,避免文件泄露。二进制模式支持处理非文本文件,struct模块便于解析结构化数据。结合ospathlib模块可高效进行文件系统操作。在实际开发中,务必添加异常处理机制确保程序的健壮性。掌握这些文件操作方法是进行数据处理、日志记录、配置管理等任务的基础技能。

发表回复

后才能评论