如何使用pandas遍历子文件夹并按文件名规则分类移动文件
实现思路
这个需求的核心是目录递归遍历、文件名规则匹配、批量文件移动,纯文件分类移动不需要复杂的pandas数据处理逻辑,搭配Python原生的os、shutil库即可完成,整体流程拆分为4步:
- 提前创建两类文件对应的目标存储文件夹,避免移动时因路径不存在抛出错误
- 递归遍历根目录下所有层级的子文件夹,过滤出后缀为.csv的目标文件,跳过其他格式内容
- 提取每个csv文件的文件名首字符,判断属于数字开头还是非数字(字符串)开头
- 执行文件移动操作,内置重名文件自动加后缀的逻辑,避免同名文件被覆盖
注:csv是逗号分隔的纯文本格式,和xlsx/xls格式的二进制Excel文件有区别,下方代码默认处理.csv后缀文件,如果需要处理Excel文件,只需修改后缀判断的条件即可。
参考代码
代码里的路径配置项直接替换成你本地的实际路径就能运行,每一步都加了注释,适合初学者对照修改:
import os import shutil import pandas as pd # -------------------------- 路径配置区 按需修改 -------------------------- ROOT_FOLDER = r"替换成你的根文件夹绝对路径" # Windows路径示例:r"C:\Docs\csv_source" TARGET_STR_START = r"替换成字符串开头文件的目标存储路径" # 示例:r"C:\Docs\res\str_csv" TARGET_NUM_START = r"替换成数字开头文件的目标存储路径" # 示例:r"C:\Docs\res\num_csv" # ------------------------------------------------------------------------ # 初始化创建目标文件夹,文件夹已存在时不会重复创建报错 os.makedirs(TARGET_STR_START, exist_ok=True) os.makedirs(TARGET_NUM_START, exist_ok=True) # 递归遍历根目录下所有层级的文件和文件夹 for current_dir, _, file_list in os.walk(ROOT_FOLDER): # 跳过目标存储文件夹本身,避免重复扫描已经移动完成的文件 if current_dir in [TARGET_STR_START, TARGET_NUM_START]: continue for file_name in file_list: # 过滤非csv文件,要处理xlsx就把".csv"改成".xlsx" if not file_name.lower().endswith(".csv"): continue # 拼接文件的原始完整路径 old_full_path = os.path.join(current_dir, file_name) first_char = file_name[0] # 匹配对应目标路径 if first_char.isdigit(): target_root = TARGET_NUM_START else: target_root = TARGET_STR_START target_full_path = os.path.join(target_root, file_name) # 重名处理:目标路径存在同名文件时自动追加(1)(2)序号后缀 suffix_counter = 1 while os.path.exists(target_full_path): name, ext = os.path.splitext(file_name) target_full_path = os.path.join(target_root, f"{name}({suffix_counter}){ext}") suffix_counter += 1 # 执行移动操作 shutil.move(old_full_path, target_full_path) print(f"移动完成:{old_full_path} -> {target_full_path}") print("所有文件分类移动执行完毕")
使用注意事项
- 首次运行前务必备份一份原始文件,避免路径配置错误导致文件丢失
- Windows路径前面加
r是为了屏蔽反斜杠的转义作用,Mac/Linux路径直接写正常字符串即可 - 如果需要在移动前对csv内容做校验(比如判断文件是否损坏、字段是否齐全),可以在移动逻辑前加
df = pd.read_csv(old_full_path),编写你需要的校验规则,不符合要求的文件直接continue跳过即可 - 如果你的分类规则不是“非数字开头即字符串开头”,而是要匹配指定固定前缀(比如必须以"sales_"开头才归为字符串类),直接把首字符判断逻辑替换为
file_name.startswith("sales_")即可
内容的提问来源于stack exchange,提问作者rachuri revanth
相关产品推荐
相关产品推荐

