AI大模型教程
一起来学习

Python 文件操作进阶:复制、移动、删除与 CSV 读写实战

在 Python 日常开发中,除了基础的文件读写,我们还经常需要处理文件的复制、移动、删除,以及 CSV 格式数据的读写(如表格数据处理)。本文将结合实战代码,详细讲解 shutil 模块(文件 / 目录操作)和 csv 模块(CSV 数据处理)的核心用法,覆盖从文件复制到 CSV 数据读写的完整流程,帮助你高效处理文件相关任务。


一、shutil 模块:文件与目录的高级操作

shutil 是 Python 内置模块,封装了文件和目录的高级操作,包括复制、移动、删除等,功能比基础的 os 模块更强大。下面通过实战案例演示其核心用法。

1.1 基础文件复制:文本文件与图片文件

文件复制分为文本文件二进制文件(如图片、音频),核心是 “读取源文件内容 → 写入目标文件”,也可直接使用 shutil.copy() 简化操作。

案例 1:手动实现文件复制(理解底层逻辑)

通过 open() 读取源文件内容,再写入目标文件,适用于需要自定义复制逻辑的场景(如复制时修改内容)。

# 1. 复制文本文件(需指定 encoding)
with open(r'.datadata5.txt', mode='r', encoding='utf-8') as f_source:
    # 读取源文件所有内容
    file_content = f_source.read()
    # 写入目标文件(w 模式:不存在则创建,存在则覆盖)
    with open(r'.datadata2.txt', mode='w', encoding='utf-8') as f_target:
        f_target.write(file_content)
print("文本文件复制完成!")

# 2. 复制二进制文件(如图片,需用 rb/wb 模式,无需 encoding)
with open(r'.datafruit.jpg', mode='rb') as f_source:
    # 读取二进制内容(如图片的字节数据)
    img_content = f_source.read()
    with open(r'.datafruit2.jpg', mode='wb') as f_target:
        f_target.write(img_content)
print("图片文件复制完成!")

关键区别

  • 文本文件:用 r/w 模式,需指定 encoding(如 utf-8);
  • 二进制文件:用 rb/wb 模式,无需指定 encoding(直接操作字节数据)。
案例 2:shutil.copy() 简化文件复制

shutil.copy(源路径, 目标路径) 是更简洁的复制方式,自动处理文本 / 二进制文件的差异,无需手动读写内容。

import shutil

# 复制文件:将 data2.txt 复制为 data6.txt(同一目录下)
shutil.copy(r'.datadata2.txt', r'.datadata6.txt')
# 也可复制到其他目录:shutil.copy(r'.datadata2.txt', r'.new_dirdata6.txt')
print("shutil.copy 复制文件完成!")

功能说明

  • 若目标路径是文件名(如 .datadata6.txt),则直接创建 / 覆盖该文件;
  • 若目标路径是目录(如 .new_dir),则在该目录下创建与源文件同名的文件。

1.2 目录复制:shutil.copytree() 递归复制目录

shutil.copytree(源目录, 目标目录) 可递归复制整个目录(包括子目录和所有文件),目标目录必须不存在(否则报错)。

import shutil

# 递归复制 data 目录到 data2 目录(data2 会自动创建)
shutil.copytree(r'.data', r'.data2')
print("目录递归复制完成!")

注意事项

  • 若目标目录(如 .data2)已存在,会抛出 FileExistsError,需先删除或重命名目标目录;
  • 复制过程中会保留文件的权限、修改时间等元数据(默认行为)。

1.3 文件 / 目录移动:shutil.move() 灵活迁移

shutil.move(源路径, 目标路径) 可移动文件或目录,支持 “文件→目录”“目录→目录”“文件→文件” 三种场景,功能类似操作系统的 “剪切 – 粘贴”。

import shutil

# 1. 移动目录:将 data 目录移动到 pk 目录下(pk 目录需存在)
shutil.move(r'.data', r'.pk')
# 移动后路径:.pkdata

# 2. 移动文件:将 data6.txt 移动到 pk 目录下(若 pk 不存在会报错)
shutil.move(r'.datadata6.txt', r'.pk')
# 移动后路径:.pkdata6.txt

print("文件/目录移动完成!")

场景说明

  • 若目标路径是目录且存在:源路径(文件 / 目录)会被移动到该目录下;
  • 若目标路径是文件且存在:源文件会覆盖目标文件(需谨慎,避免数据丢失)。

1.4 目录删除:os.rmdir() vs shutil.rmtree()

删除目录需区分 “空目录” 和 “非空目录”,os 和 shutil 提供了不同的方法:

import os
import shutil

# 1. os.rmdir():仅删除空目录(目录内有文件/子目录则报错)
try:
    os.rmdir(r'.b')  # 若 .b 是空目录,删除成功;否则抛 OSError
except OSError as e:
    print(f"os.rmdir 失败:{e}")

# 2. shutil.rmtree():递归删除目录及所有内容(包括非空目录,慎用!)
shutil.rmtree(r'.b')  # 无论 .b 是否为空,都会彻底删除(无法恢复)
print("目录删除完成!")

风险提示

  • shutil.rmtree() 是不可逆操作,会直接删除目录内所有文件和子目录,使用前务必确认路径正确(建议先备份重要数据)。

二、csv 模块:CSV 格式数据的读写

CSV(逗号分隔值)是常用的表格数据格式,csv 模块是 Python 处理 CSV 文件的官方工具,支持 “列表式” 和 “字典式” 两种读写方式,适配不同场景。

2.1 列表式读写:csv.writer() 与 csv.reader()

适合简单的 CSV 数据处理,以 “列表” 为单位读写每行数据,无需关注表头(若有表头需手动处理)。

案例 1:写入 CSV 文件(csv.writer()
import csv

# 打开 CSV 文件:mode='w'(覆盖写),newline=''(避免空行),encoding='utf-8'(支持中文)
with open(r'.adata.csv', mode='w', newline='', encoding='utf-8') as f:
    # 创建 writer 对象
    csv_writer = csv.writer(f)
    # 1. 写单行数据(参数是列表)
    # csv_writer.writerow(['name', 'age', 'gender'])  # 可选:写入表头
    # 2. 写多行数据(参数是列表的列表)
    csv_writer.writerows([
        ['mary', 20, '女'],
        ['tom', 30, '男'],
        ['lily', 25, '女']
    ])
print("CSV 文件写入完成!")

关键参数

  • newline='':必须添加,否则 Windows 系统下会自动插入空行(CSV 格式要求);
  • encoding='utf-8':确保中文正常显示(避免乱码)。
案例 2:读取 CSV 文件(csv.reader()
import csv

with open(r'.adata.csv', mode='r', newline='', encoding='utf-8') as f:
    # 创建 reader 对象(可迭代,每行数据是列表)
    csv_reader = csv.reader(f)
    # 1. 读取单行:用 next() 获取第一行
    # header = next(csv_reader)
    # print("表头:", header)
    
    # 2. 读取所有行:用 for 循环迭代
    print("CSV 文件内容:")
    for row in csv_reader:
        # row 是列表,可通过索引获取对应字段
        name, age, gender = row
        print(f"姓名:{name},年龄:{age},性别:{gender}")

输出结果

CSV 文件内容:
姓名:mary,年龄:20,性别:女
姓名:tom,年龄:30,性别:男
姓名:lily,年龄:25,性别:女

2.2 字典式读写:csv.DictWriter() 与 csv.DictReader()

适合带表头的 CSV 文件,以 “字典” 为单位读写数据(键是表头,值是对应字段内容),无需手动处理索引,代码更易读。

案例 1:写入 CSV 文件(csv.DictWriter()
import csv

# 准备字典格式的数据(键需与后续表头对应)
data = [
    {'name': 'Alice', 'age': 25, 'city': 'New York'},
    {'name': 'Bob', 'age': 30, 'city': 'San Francisco'},
    {'name': 'Charlie', 'age': 35, 'city': 'Chicago'}
]

with open(r'.adata2.csv', mode='w', newline='', encoding='utf-8') as f:
    # 1. 定义表头(必须与字典的键一致)
    fieldnames = ['name', 'age', 'city']
    # 2. 创建 DictWriter 对象,指定表头
    csv_writer = csv.DictWriter(f, fieldnames=fieldnames)
    # 3. 写入表头(可选,若不写则直接写数据)
    csv_writer.writeheader()
    # 4. 写入数据(支持单行 writerow() 或多行 writerows())
    csv_writer.writerows(data)
print("字典格式 CSV 写入完成!")

优势

  • 数据与表头强关联,即使字段顺序变化,也能正确写入对应列;
  • 无需记忆字段索引,代码可读性更高。
案例 2:读取 CSV 文件(csv.DictReader()
import csv

with open(r'.adata2.csv', mode='r', newline='', encoding='utf-8') as f:
    # 创建 DictReader 对象(自动读取第一行为表头,每行数据是字典)
    csv_reader = csv.DictReader(f)
    print("字典格式 CSV 内容:")
    for row in csv_reader:
        # row 是字典,可通过键获取对应字段(键是表头)
        print(f"姓名:{row['name']},年龄:{row['age']},城市:{row['city']}")

输出结果

字典格式 CSV 内容:
姓名:Alice,年龄:25,城市:New York
姓名:Bob,年龄:30,城市:San Francisco
姓名:Charlie,年龄:35,城市:Chicago

三、常见问题与解决方案

在使用 shutil 和 csv 模块时,初学者常遇到路径错误、编码乱码等问题,以下是高频问题的解决方法。

3.1 shutil.copytree() 目标目录已存在

错误FileExistsError: [WinError 183] 当文件已存在时,无法创建该文件。: '.data2'
解决:先删除目标目录(用 shutil.rmtree()),再执行复制:

import shutil
import os

target_dir = r'.data2'
# 若目标目录存在,先删除
if os.path.exists(target_dir):
    shutil.rmtree(target_dir)
# 再复制目录
shutil.copytree(r'.data', target_dir)

3.2 CSV 文件中文乱码

错误:用 Excel 打开 CSV 文件时中文显示乱码(如 “梅里”)。
解决:写入时指定 encoding='utf-8-sig'(而非 utf-8),添加 BOM 头让 Excel 识别:

with open(r'.adata.csv', mode='w', newline='', encoding='utf-8-sig') as f:
    csv_writer = csv.writer(f)
    csv_writer.writerows([['张三', 28, '男'], ['李四', 32, '女']])

3.3 os.rmdir() 删除非空目录报错

错误OSError: [WinError 145] 目录不是空的。: '.b'
解决:用 shutil.rmtree() 递归删除非空目录(注意风险):

import shutil
shutil.rmtree(r'.b')  # 彻底删除目录及所有内容

四、总结

本文通过实战代码覆盖了 Python 文件操作的进阶场景,核心要点总结如下:

1. shutil 模块核心用法

功能 方法 关键说明
复制文件 shutil.copy(源, 目标) 自动处理文本 / 二进制文件,目标可是文件或目录
复制目录 shutil.copytree(源目录, 目标目录) 递归复制所有内容,目标目录必须不存在
移动文件 / 目录 shutil.move(源, 目标) 类似 “剪切 – 粘贴”,支持跨目录移动
删除目录 shutil.rmtree(目录) 递归删除非空目录,不可逆,需谨慎

2. csv 模块核心用法

读写方式 写入方法 读取方法 适用场景
列表式 csv.writer() + writerow()/writerows() csv.reader() + 迭代 简单无表头或表头手动处理
字典式 csv.DictWriter() + writeheader()/writerows() csv.DictReader() + 迭代 带表头的 CSV,代码易读

掌握这些工具后,你可以轻松处理文件复制、迁移、批量删除,以及 CSV 表格数据的读写需求,无论是日常数据处理还是自动化脚本开发,都能大幅提升效率。后续可进一步学习 shutil 的压缩 / 解压功能(如 shutil.make_archive())和 csv 的自定义分隔符(如用 ; 分隔),扩展更多实用场景。

文章来源于互联网:Python 文件操作进阶:复制、移动、删除与 CSV 读写实战

相关推荐: 软件推荐[Windows]WinRAR(压缩软件) v7.13 汉化版

获取地址:WinRAR(压缩软件) WinRAR压缩文件管理器是一款老牌压缩软件知名产品的经典装机软件.WinRAR压缩软件打包工具文件解压缩软件提供RAR和ZIP文件的完整支持,WinRAR解压工具功能包括固实压缩,分卷压缩,压缩加密,自解压模块,各种自定义…

赞(0)
未经允许不得转载:5bei.cn大模型教程网 » Python 文件操作进阶:复制、移动、删除与 CSV 读写实战
分享到: 更多 (0)

AI大模型,我们的未来

小欢软考联系我们