在编程世界中,文件操作和异常处理是两个非常重要的概念。无论是保存用户数据、读取配置文件,还是处理程序运行中可能出现的错误,都离不开这两项技能。本文将详细介绍 Python 中的文件操作和异常处理机制,帮助读者掌握这些实用的编程技能

一、文件的概念

1.1 什么是文件​

文件是计算机中存储数据的基本单位。内存中存放的数据在计算机关机后就会消失,而文件可以将数据长久地保存在硬盘、光盘、U 盘等存储设备中。一篇文章、一段视频、一个可执行程序,都可以被保存为一个文件,并赋予一个文件名。​

操作系统以文件为单位管理磁盘中的数据。根据内容和用途,文件可以分为多种类型:​

  • 文本文件:存储文字信息,如.txt、.docx 文件​
  • 视频文件:存储视频数据,如.mp4、.avi 文件​
  • 音频文件:存储音频数据,如.mp3、.wav 文件​
  • 图像文件:存储图像数据,如.jpg、.png 文件​
  • 可执行文件:可以直接运行的程序,如.exe、.py 文件

1.2 文件操作包含哪些内容​

在日常编程中,我们对文件的主要操作包括:​

  • 创建文件​
  • 打开文件​
  • 读取文件内容​
  • 写入文件内容​
  • 关闭文件​
  • 文件备份

1.3 文件操作的作用​

文件操作的主要作用是数据持久化存储。通过文件操作,我们可以:​

  • 把程序运行过程中产生的数据保存起来​
  • 让程序下次执行时可以直接使用之前保存的数据​
  • 实现数据的共享和传输​
  • 节省重新生成数据的时间和资源

二、文件的基本操作​

2.1 文件操作三步走​

Python 中进行文件操作遵循一个简单的三步流程:​

  1. 打开文件:使用open()函数打开文件,获取文件对象​
  2. 读写文件:通过文件对象的方法进行读取或写入操作​
  3. 关闭文件:使用close()方法关闭文件,释放资源

2.2 open 函数打开文件

open()函数是 Python 中打开文件的主要方法,其基本语法如下:

f = open(name, mode)

参数说明:​

  • name:要打开的文件名(可以包含文件路径)​
  • mode:打开文件的模式(访问模式)​
  • 返回值:一个文件对象,后续的文件操作都通过这个对象进行

2.3 文件打开模式详解​

文件打开模式决定了我们可以对文件进行哪些操作。常用的模式有:

模式

描述

r

只读模式,文件指针在开头

w

只写模式,覆盖原有内容

a

追加模式,在文件末尾添加内容

r+

读写模式,文件指针在开头

w+

读写模式,覆盖原有内容

a+

读写模式,文件指针在末尾

重要说明:​

  • r 模式:文件必须存在,否则会报错​
  • w 模式:文件不存在则创建,存在则清空原有内容​
  • a 模式:文件不存在则创建,存在则在末尾追加内容

2.4 write 函数写入文件​

使用文件对象的write()方法可以向文件中写入内容:

f.write('要写入的内容')

注意事项:​

  • 写入的内容必须是字符串类型​
  • 中文写入可能会出现乱码问题,需要指定编码方式

2.5 解决中文乱码问题​

中文乱码是文件操作中常见的问题,主要原因是编码方式不匹配。解决方法是在打开文件时指定编码方式:

# 使用UTF-8编码打开文件
f = open('test.txt', 'w', encoding='utf-8')
f.write('中文内容')
f.close()

常用的编码方式:​

  • UTF-8:通用的 Unicode 编码,推荐使用​
  • GBK:中文编码标准​
  • ASCII:英文编码标准

2.6 文件读取操作​

Python 提供了多种读取文件的方法:​

1. read () 方法

# 读取所有内容
content = f.read()

# 读取指定长度的内容
content = f.read(1024)  # 读取1024个字符

2. readlines () 方法

# 按行读取所有内容,返回列表
lines = f.readlines()
for line in lines:
    print(line)

3. readline () 方法

# 逐行读取内容
while True:
    line = f.readline()
    if not line:
        break
    print(line, end='')

2.7 close 函数关闭文件

文件操作完成后,必须关闭文件以释放系统资源:

f.close()

为什么要关闭文件?​

  • 释放操作系统分配的文件描述符​
  • 确保所有缓冲的数据都被写入磁盘​
  • 防止文件被锁定,影响其他程序访问

2.8 简单案例

案例 1:创建并写入文件

# 打开文件(不存在则创建)
f = open('hello.txt', 'w', encoding='utf-8')

# 写入内容
f.write('Hello, Python!\n')
f.write('这是我的第一个文件操作程序\n')

# 关闭文件
f.close()

print('文件创建完成!')

案例 2:读取文件内容

# 打开文件
f = open('hello.txt', 'r', encoding='utf-8')

# 读取内容
content = f.read()
print('文件内容:')
print(content)

# 关闭文件
f.close()

三、文件备份案例

3.1 案例需求​

实现一个文件备份功能:​

  • 用户输入要备份的文件名​
  • 程序自动创建备份文件​
  • 备份文件名为原文件名加 "[备份]" 后缀​
  • 例如:test.txt → test [备份].txt

3.2 实现思路​

  1. 接收用户输入的文件名​
  2. 生成备份文件名​
  3. 读取源文件内容​
  4. 将内容写入备份文件​
  5. 关闭文件

3.3 代码实现

def backup_file():
    # 1. 接收用户输入的文件名
    old_filename = input('请输入要备份的文件名:')
    
    # 2. 生成备份文件名
    # 找到文件名中的点号位置
    dot_index = old_filename.rfind('.')
    if dot_index > 0:
        # 有扩展名的文件
        new_filename = old_filename[:dot_index] + '[备份]' + old_filename[dot_index:]
    else:
        # 没有扩展名的文件
        new_filename = old_filename + '[备份]'
    
    try:
        # 3. 打开源文件和备份文件
        with open(old_filename, 'rb') as old_file:
            with open(new_filename, 'wb') as new_file:
                # 4. 读取并写入文件内容
                while True:
                    # 每次读取1024字节
                    content = old_file.read(1024)
                    if not content:
                        break
                    new_file.write(content)
        
        print(f'文件备份成功!备份文件名为:{new_filename}')
        
    except FileNotFoundError:
        print(f'错误:文件"{old_filename}"不存在')
    except Exception as e:
        print(f'备份过程中发生错误:{e}')

# 调用函数
backup_file()

3.4 代码优化要点​

  1. 使用 with 语句:自动管理文件关闭,避免资源泄漏​
  2. 二进制模式操作:适用于所有类型文件,包括图片、音频等​
  3. 异常处理:处理文件不存在等可能出现的错误​
  4. 分块读取:避免一次性读取大文件导致内存不足

四、文件和文件夹操作​

4.1 os 模块介绍​

在 Python 中,文件和文件夹的操作需要使用os模块。os模块提供了丰富的方法来处理文件和目录

使用步骤:​

  1. 导入 os 模块​
  2. 调用 os 模块中的相关函数
import os

4.2 文件操作方法

函数

功能

示例

os.rename()

文件重命名

os.rename('old.txt', 'new.txt')

os.remove()

删除文件

os.remove('file.txt')

os.path.exists()

检查文件是否存在

if os.path.exists('file.txt'):

os.path.getsize()

获取文件大小

size = os.path.getsize('file.txt')

示例代码:

import os
import time

# 文件重命名
os.rename('old_name.txt', 'new_name.txt')
print('文件重命名完成')

# 延时查看效果
time.sleep(5)

# 删除文件
os.remove('new_name.txt')
print('文件删除完成')

4.3 文件夹操作方法

函数

功能

示例

os.mkdir()

创建文件夹

os.mkdir('test_folder')

os.rmdir()

删除空文件夹

os.rmdir('test_folder')

os.listdir()

列出文件夹内容

files = os.listdir('.')

os.path.isdir()

检查是否为文件夹

if os.path.isdir('folder'):

示例代码:

import os

# 创建文件夹
os.mkdir('test')
print('文件夹创建完成')

# 列出文件夹内容
print('当前目录内容:')
for item in os.listdir('.'):
    print(item)

# 删除文件夹
os.rmdir('test')
print('文件夹删除完成')

4.4 递归删除文件夹

os.rmdir()只能删除空文件夹。要删除非空文件夹,需要使用递归方法:

import os

def delete_folder(folder_path):
    # 遍历文件夹中的所有内容
    for item in os.listdir(folder_path):
        item_path = os.path.join(folder_path, item)
        
        # 如果是文件,直接删除
        if os.path.isfile(item_path):
            os.remove(item_path)
            print(f'删除文件:{item_path}')
        # 如果是文件夹,递归删除
        elif os.path.isdir(item_path):
            delete_folder(item_path)
            print(f'删除文件夹:{item_path}')
    
    # 删除空文件夹
    os.rmdir(folder_path)
    print(f'删除文件夹:{folder_path}')

# 使用示例
# delete_folder('test_folder')  # 谨慎使用!

警告: 递归删除操作非常危险,请务必谨慎使用,避免误删重要文件

4.5 文件路径知识

文件路径是指文件在计算机中的存储位置,分为两种类型:

1. 绝对路径

从盘符开始的完整路径,例如:

C:\Users\Documents\file.txt

2. 相对路径​

相对于当前程序所在目录的路径:​

  • 同级路径:直接使用文件名​
  • 下一级路径:使用文件夹名/文件名​
  • 上一级路径:使用../文件名

示例:

# 同级路径
f = open('data.txt', 'r')

# 下一级路径
f = open('files/data.txt', 'r')

# 上一级路径
f = open('../data.txt', 'r')

五、Python 异常处理

5.1 什么是异常​

异常是程序运行过程中出现的错误。当 Python 解释器遇到无法处理的错误时,会抛出异常并终止程序执行

常见的异常类型:​

  • FileNotFoundError:文件不存在​
  • ZeroDivisionError:除数为零​
  • TypeError:类型错误​
  • ValueError:数值错误​
  • IndexError:索引越界

异常示例:

# 文件不存在异常
f = open('nonexistent.txt', 'r')
# 输出:FileNotFoundError: [Errno 2] No such file or directory: 'nonexistent.txt'

# 除数为零异常
print(10 / 0)
# 输出:ZeroDivisionError: division by zero

5.2 异常捕获机制

异常捕获可以让程序在出现错误时不会立即终止,而是执行相应的处理代码。Python 使用try...except语句来捕获异常

基本语法:

try:
    # 可能出现异常的代码
    risky_code()
except:
    # 出现异常时执行的代码
    handle_exception()

捕获特定异常:

try:
    f = open('file.txt', 'r')
except FileNotFoundError:
    print('文件不存在,正在创建新文件...')
    f = open('file.txt', 'w')

捕获多个异常:

try:
    result = 10 / int(input('请输入除数:'))
    print(f'结果:{result}')
except ValueError:
    print('输入的不是有效数字!')
except ZeroDivisionError:
    print('除数不能为零!')
except Exception as e:
    print(f'发生了未知错误:{e}')

5.3 获取异常信息

使用as关键字可以获取异常对象,从而获得更详细的错误信息:

try:
    f = open('file.txt', 'r')
except Exception as e:
    print(f'错误类型:{type(e).__name__}')
    print(f'错误信息:{e}')
    print(f'错误参数:{e.args}')

5.4 else 语句

else语句用于指定当没有异常发生时要执行的代码:

try:
    f = open('file.txt', 'r')
except FileNotFoundError:
    print('文件不存在')
else:
    # 只有在没有异常时才执行
    content = f.read()
    print(f'文件内容:{content}')
    f.close()

5.5 finally 语句

finally语句用于指定无论是否发生异常都要执行的代码,通常用于资源清理:

f = None
try:
    f = open('file.txt', 'r')
    content = f.read()
    print(content)
except FileNotFoundError:
    print('文件不存在')
finally:
    # 无论是否有异常,都确保文件被关闭
    if f:
        f.close()
        print('文件已关闭')

5.6 异常处理最佳实践​

  1. 只捕获必要的异常:不要使用空的except语句捕获所有异常​
  2. 提供具体的错误信息:帮助用户理解和解决问题​
  3. 及时清理资源:使用finally或with语句确保资源被正确释放​
  4. 避免过度使用异常:对于可预见的错误,应该使用条件判断来处理​
  5. 记录异常日志:在生产环境中,应该将异常信息记录到日志文件中

六、总结与进阶建议

回顾:​

  1. 文件操作基础:打开、读写、关闭文件的基本方法​
  2. 文件模式:r、w、a 等模式的区别和使用场景​
  3. 路径处理:绝对路径和相对路径的概念和使用​
  4. os 模块:文件和文件夹的各种操作方法​
  5. 异常处理:try、except、else、finally 语句的使用​
  6. 实际应用:通过综合案例巩固所学知识

进阶学习建议:

学习 with 语句:更优雅的文件管理方式

with open('file.txt', 'r') as f:
    content = f.read()

掌握 pathlib 模块:现代的路径处理方式

from pathlib import Path
file = Path('data.txt')

学习 pickle 模块:Python 对象的序列化和反序列化

import pickle
with open('data.pkl', 'wb') as f:
    pickle.dump(data, f)

Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐