任务需求 🚀
test 文件夹下存在多个子文件夹,每个子文件夹下都包含若干个 csv 文件(以 .csv 结尾),如下图所示:

假设想要把这些 csv 文件全部移动至同一个汇总文件夹 total 中,请问如何编写 Python 脚本,实现这一目标?

基础知识 ✍️
阅读须知:本案例代码均以 MacOS 为例子,Window系统的路径名和 MacOS 略有不同❗️
Python版本:3.9.10
shutil 模块
shutil 是 Python 标准库中的一个文件操作工具,提供了一系列用于 对文件和目录进行高级操作 的函数。它的目标是提供一种简单、易于使用的接口,使文件操作更加方便和灵活。
下面是一些 shutil 库的简单例子:
复制文件:
import shutil # 复制单个文件 shutil.copy('source_file.txt', 'destination_folder/') shutil.copy2('source_file.txt', 'destination_folder/') # 复制整个文件夹 shutil.copytree('source_folder/', 'destination_folder/')🍉PS:
copy2和copy都可以用于复制,但是copy2还会复制文件的元数据(如权限、时间戳等)移动文件:
import shutil # 移动单个文件 shutil.move('source_file.txt', 'destination_folder/') # 移动整个文件夹 shutil.move('source_folder/', 'destination_folder/')
这些例子只是 shutil 库提供功能的一小部分,该库还提供了其他功能,如归档文件、修改文件权限、处理文件链接等。通过 shutil 库,可以更方便地进行文件和目录的操作和管理。
glob 模块
glob 库是用于匹配文件路径名的模块,它提供了一种简单且易用的方法来查找符合特定模式的文件和目录。
glob 库是Python标准库的一部分,因此 无需安装 即可使用。
使用 glob 库,你可以使用通配符来匹配文件名,类似于在命令行中使用通配符进行文件查找。
通配符是一种表示文件名模式的特殊字符,如
*(匹配任意多个字符)和?(匹配单个字符),这使得在一个目录中查找满足某种模式的文件变得非常方便。
下面是一些 glob 库常用的函数和通配符的示例:
glob.glob(pattern):返回一个符合指定模式的文件路径列表。模式可以包含通配符,例如*.txt表示匹配所有以.txt为扩展名的文件。glob.iglob(pattern):返回一个迭代器,逐个产生符合指定模式的文件路径。*:匹配任意多个字符,例如*.txt可以匹配所有以.txt为扩展名的文件。?:匹配单个字符,例如?.txt可以匹配一个字符加上.txt的文件名。
下面是一个简单的示例,演示如何使用glob库来查找所有以 .txt 为扩展名的文件:
import glob
files = glob.glob('*.txt') # files为列表
for file in files:
print(file)
该示例将打印出当前目录下所有以.txt为扩展名的文件名。
os 模块
Python的os模块是用于与操作系统进行交互的模块。它提供了许多函数来处理文件和目录以及执行其他与操作系统相关的任务。
下面是os模块的一些常用功能:
- 文件和目录操作:
os.getcwd():获取当前工作目录的路径。os.chdir(path):改变当前工作目录为指定路径。os.listdir(path):返回指定目录中的文件和目录列表。os.mkdir(path):创建一个新目录。os.remove(path):删除指定路径的文件。os.rmdir(path):删除指定路径的目录(必须是空目录)。os.path.join(path1, path2):将两个路径组合成一个完整的路径。
- 路径操作:
os.path.abspath(path):返回指定路径的绝对路径。os.path.exists(path):检查指定路径是否存在。os.path.isfile(path):检查指定路径是否为文件。os.path.isdir(path):检查指定路径是否为目录。os.path.splitext(path):分割路径的扩展名。
- 系统环境和变量:
os.environ:包含当前系统环境变量的字典。os.getenv(name):获取指定环境变量的值。os.putenv(name, value):设置指定环境变量的值。
- 执行系统命令:
os.system(command):在子shell中执行系统命令。os.popen(command):打开一个管道,执行系统命令。os.exec*():执行一个新的程序,替代当前进程。
Python代码 🧑🏻💻
阅读须知:本案例代码均以 MacOS 为例,Window系统的路径名和 MacOS 略有不同❗️
Python版本:3.9.10
本任务代码
import shutil
import glob
import os
source_folder = '/Users/rickyx/Desktop/test' # 大文件夹的路径
destination_folder = '/Users/rickyx/Desktop/test/total' # 目标文件夹的路径
# 当前目标文件夹不存在,自动创建该汇总文件夹
if not os.path.exists(destination_folder):
os.makedirs(destination_folder)
for csv_file in glob.glob(source_folder + '/**/*.csv', recursive=True):
shutil.copy(csv_file, destination_folder)
扩展代码
import shutil
import glob
import os
source_folder = '' # 在引号中添加大文件夹的路径
destination_folder = '' # 在引号中添加目标汇总文件夹的路径
# 当前目标文件夹不存在,自动创建该汇总文件夹
if not os.path.exists(destination_folder):
os.makedirs(destination_folder)
# 可以将csv后缀换成自己需要的文件后缀名
for csv_file in glob.glob(source_folder + '/**/*.csv', recursive=True):
shutil.copy(csv_file, destination_folder)