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()
核心思路
- 用
os.walk遍历源目录,定位到包含.txt文件的日期文件夹 - 通过
os.path.relpath获取当前目录相对源目录的路径,拆分后只保留最上层的AAAA文件夹名称 - 直接将文件移动到
目标目录\AAAA下,跳过中间的日期文件夹层级 - 清空
dirs列表,避免继续遍历当前日期文件夹的子目录(因为已经处理完该目录下的所有txt文件)
兼容跨系统的路径处理(可选优化)
如果需要适配Windows/Linux不同的路径分隔符,可以把拆分路径的代码替换为:
# 标准化路径后拆分层级 parts = os.path.normpath(rel_path).split(os.sep) # 取路径的第一层级(也就是AAAA) target_folder = parts[0]
内容的提问来源于stack exchange,提问作者Dilshan
相关产品推荐
相关产品推荐

