You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python移动文件:如何无需预定义名称移除原路径冗余子文件夹?

解决移除中间层级的文件移动问题

需求说明

需要将源目录(结构为folder\AAAA\日期文件夹\file.txt)中的.txt文件移动到目标目录,最终只保留AAAA文件夹和file.txt,要移除AAAA下方的日期子文件夹,且不需要预先指定日期文件夹的名称。

原代码问题

原代码会完整复制源目录结构,虽然用replace指定日期名称可以临时解决,但无法适配任意日期文件夹的情况。

改进后的代码

import os
import shutil

source_dir = "folder\\"
dest_dir = "newfolder\\"

# 遍历源目录下所有文件和文件夹
for root, dirs, files in os.walk(source_dir):
    # 筛选当前目录下的txt文件
    txt_files = [f for f in files if f.endswith('.txt')]
    if txt_files:
        # 获取当前目录相对于源目录的路径(比如:AAAA\2024-05-20)
        rel_path = os.path.relpath(root, source_dir)
        # 拆分路径层级,只保留最上层的AAAA部分
        target_folder = os.path.split(rel_path)[0]
        # 构建目标文件夹路径:newfolder\AAAA
        dest_subdir = os.path.join(dest_dir, target_folder)
        # 确保目标文件夹存在,不存在则创建
        os.makedirs(dest_subdir, exist_ok=True)
        
        # 逐个移动txt文件
        for file in txt_files:
            src_file_path = os.path.join(root, file)
            dest_file_path = os.path.join(dest_subdir, file)
            
            # 可选:处理目标目录已存在同名文件的情况
            if os.path.exists(dest_file_path):
                print(f"跳过:{file} 已存在于目标目录")
                continue
            
            shutil.move(src_file_path, dest_file_path)
            print(f"已移动:{file} -> {dest_subdir}")
        
        # 清空dirs列表,停止遍历当前目录的子文件夹(避免重复处理)
        dirs.clear()

核心思路

  1. 用os.walk遍历源目录,定位到包含.txt文件的日期文件夹
  2. 通过os.path.relpath获取当前目录相对源目录的路径,拆分后只保留最上层的AAAA文件夹名称
  3. 直接将文件移动到目标目录\AAAA下,跳过中间的日期文件夹层级
  4. 清空dirs列表,避免继续遍历当前日期文件夹的子目录(因为已经处理完该目录下的所有txt文件)

兼容跨系统的路径处理(可选优化)

如果需要适配Windows/Linux不同的路径分隔符,可以把拆分路径的代码替换为:

# 标准化路径后拆分层级
parts = os.path.normpath(rel_path).split(os.sep)
# 取路径的第一层级(也就是AAAA)
target_folder = parts[0]

内容的提问来源于stack exchange,提问作者Dilshan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.29 23:00:39