Skip to content

Python 文件操作(File)

在 Python 中,文件操作是一项基本但重要的功能。本章节将详细介绍 Python 中的文件操作,包括文件的打开、读取、写入、关闭以及其他常用的文件操作方法。

文件操作的基本流程

Python 中文件操作的基本流程如下:

  1. 打开文件:使用 open() 函数打开文件,获取文件对象
  2. 操作文件:对文件进行读取或写入操作
  3. 关闭文件:使用 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 中的文件操作是一项基本但重要的功能,本章节介绍了:

  1. 文件操作的基本流程:打开文件 → 操作文件 → 关闭文件
  2. 文件的打开open() 函数及其参数
  3. 文件的关闭close() 方法和 with 语句
  4. 文件的读取read()readline()readlines() 方法和迭代文件对象
  5. 文件的写入write()writelines() 方法
  6. 文件指针操作tell()seek() 方法
  7. 二进制文件操作:以二进制模式打开和操作文件
  8. 文件操作的异常处理:捕获和处理文件操作中的异常
  9. 文件对象的属性和方法:文件对象的各种属性和方法
  10. 实际应用示例:复制文件、统计文件行数、查找关键字、读写 CSV 文件

掌握这些文件操作技巧,对于处理各种文件相关任务非常重要。在实际应用中,我们应该根据具体需求选择合适的文件操作方法,并注意异常处理和资源管理。