Python小工具-复制嵌套目录下的多个word文档到指定目录
Python小工具-复制嵌套目录下的多个word文档到指定目录
需求
有多个文件目录,每个目录下都有多个文件和子目录,现在需要把这些目录中的word文档提取处理,并放到当前文件夹下,
原始数据
每个班级中有多个人的目录,每个目录下有实习报告+原代码,现在需要把每个目录中的word文档提取出来。
工具实现思路
1.导入库 os shutil 2.输入需要遍历的路径 根路径 file_path = r’F:\xx’ 3.输入需要遍历的层级 暂时未实现 4.输入需要找到的文件名后缀 file_types = [“.doc”,“.docx”] 5.确定不需要的遍历的目录 ‘data’和’code’
我这个版本采用了硬编码
6.把多个word文件提取出来存放的位置 如果指定目录不存在,则新建文件的存放目录 dst_dir = r’F:\公司\20xx’ 7.定义函数file_type_to_reduce_dir,判断文件格式,如果是文件后缀在file_types = [“.doc”,“.docx”]中,则copy或remove文件到 dst_dir 8.定义函数list_dir_by_level(递归调用),用于遍历指定目录,原计划可以指定路径level,但这个版本没有实现
。在这个函数中 调用file_type_to_reduce_dir函数。 9.调用list_dir_by_level函数
代码实现
1-6 配置项目
# 1.导入库
import os
import shutil
# 2.输入需要遍历的路径
file_path = r'F:\公司\20221124三峡大学培训\学号+姓名+实习报告\20201762+实习报告'
# 3.输入需要遍历的层级
dir_level = 3
# 4.输入需要找到的文件名后缀
file_types = [".doc",".docx"]
# 5.输入不需要读取的目录 包含这个目录就不读取
filter_dirs = ['data','code']
# 6.把文件存放的位置 如果指定目录不存在,则新建文件的存放目录
dst_dir = r'F:\公司\20221124三峡大学培训\学号+姓名+实习报告\20201762+实习报告\汇总'
if not os.path.exists(dst_dir):
os.mkdir(dst_dir)
7 定义file_type_to_reduce_dir函数完成文件复制或移动
# 定义函数 完成判断是指定格式的文档,并复制到指定的存放位置
def file_type_to_reduce_dir(filename,dst_dir,file_types,copy_or_remove="copy"):
filename当前文件的路径
dst_dir要迁移到的路径
file_types要过滤的文件类型
copy_or_remove复制或移动
# os.path.split切分路径为路径和文件名 如 c:/ 和a.txt
head_tail = os.path.split(filename)
# 如果是复制模式
if copy_or_remove =="copy":
# 遍历需要复制的文件类型
for file_type in file_types:
# 如果文件类型是需要复制的
if str(head_tail[1]).endswith(file_type):
print(f"当前需要复制的文件名为{filename}")
# 构建移动后的文件全路径
file_path_new = dst_dir+'\\' + head_tail[1]
# 复制文件到指定目录下
shutil.copyfile(filename, file_path_new)
print(f"复制:原文件{filename}--->新文件{file_path_new}")
# 如果是移动模型
elif copy_or_remove=="remove":
# 遍历需要复制的文件类型
for file_type in file_types:
print(f"当前需要移动的文件名为{filename}")
# 如果文件类型是需要复制的
if str(head_tail[1]).endswith(file_type):
# 构建移动后的文件全路径
file_path_new = dst_dir+'\\' + head_tail[1]
# 复制文件到指定目录下
# os.remove(file_path, file_path_new)
print(f"移动:原文件{file_path}--->新文件{file_path_new}")
else:
print("copy_or_remove的值为copy 或是 remove")
8 定义list_dir_by_level函数完成遍历
# 开始遍历
# 查看初级目录下的所有文件以及目录
continue_flag = False
def list_dir_by_level(file_path,dst_dir,file_types,copy_or_remove="copy"):
global continue_flag
# 遍历当前路径
dir_one = os.listdir(file_path)
for file in dir_one:
# 拼接绝对路径
abs_file_name = os.path.join(file_path,file)
# 如果路径为目标地址 跳过
if abs_file_name == dst_dir:
continue
# 跳过 指定路径
for filter_dir in filter_dirs:
if filter_dir in abs_file_name:
print(f"跳过包含{filter_dir}的目录-->{abs_file_name}")
continue_flag = True # 设置外层循环的标记
continue
if continue_flag:
continue_flag = False # 修改标记为False
continue
# if "data" in abs_file_name:
# # print(f"跳过包含data的目录-->{abs_file_name}")
# continue
# 过滤提取初级目录下的子目录
if os.path.isdir(abs_file_name):
# print(f"当前目录为{abs_file_name}")
list_dir_by_level(abs_file_name,dst_dir,file_types,copy_or_remove=copy_or_remove)
elif os.path.isfile(abs_file_name):
file_type_to_reduce_dir(abs_file_name,dst_dir,file_types,copy_or_remove=copy_or_remove)
调用函数并执行
list_dir_by_level(file_path,dst_dir,file_types)
输出为:
复制
:原文件F:\XXX\20201762班-陈家豪\2020112808+童非+实习报告\2020112808+童非+实习报告.docx—>新文件F:\XXX\汇总\2020112808+童非+实习报告.docx跳过
包含code的目录–>F:\XXX\20201762班-陈家豪\2020112808+童非+实习报告\Code\productsWebForm\node_modules@babel\code-frame跳过
包含code的目录–>F:\XXX\20201762班-陈家豪\2020112808+童非+实习报告\Code\productsWebForm\node_modules@jridgewell\sourcemap-codec跳过
包含code的目录–>F:\XXX\20201762班-陈家豪\2020112808+童非+实习报告\Code\productsWebForm\node_modules\archy\test\non_unicode.js跳过
包含code的目录–>F:\XXX\20201762班-陈家豪\2020112808+童非+实习报告\Code\productsWebForm\node_modules\bl\node_modules\string_decoder复制
:原文件F:\XXX\20201762班-陈家豪\2020159316+汤正+实习报告\2020159316-汤正-实习报告.doc—>新文件F:\公司\20221124三峡大学培训\学 号+姓名+实习报告\20201762+实习报告\汇总\2020159316-汤正-实习报告.doc跳过
包含code的目录–>F:\XXX\20201762班-陈家豪\2020159316+汤正+实习报告\code跳过
包含data的目录–>F:\公司\20221124三峡大学培 训\学号+姓名+实习报告\20201762+实习报告\20201762班-陈家豪\2020159316+汤正+实习报告\data
汇总后的文件如图
待改进地方
如果目录内的文件重名,汇总后会覆盖,可以执行rename为目录名的方式,有想完成的朋友,可以放到评论区,我会更新博客。比如,应该是66个文件,实际只有65个
完整代码
'''
Descripttion:
version:
Author: sueRimn
Date: 2022-12-27 07:37:32
LastEditors: sueRimn
LastEditTime: 2022-12-27 20:25:36
# 导入库
import os
import shutil
# 输入需要遍历的路径
file_path = r'F:\公司\20221124三峡大学培训\学号+姓名+实习报告\20201762+实习报告'
# 输入需要遍历的层级
dir_level = 3
# 输入需要找到的文件名后缀
file_types = [".doc",".docx"]
# 5.输入不需要读取的目录 包含这个目录就不读取
filter_dirs = ['data','code']
# 把文件存放的位置 如果指定目录不存在,则新建文件的存放目录
dst_dir = r'F:\公司\20221124三峡大学培训\学号+姓名+实习报告\20201762+实习报告\汇总'
if not os.path.exists(dst_dir):
os.mkdir(dst_dir)
# 定义函数 完成判断是指定格式的文档,并复制到指定的存放位置
def file_type_to_reduce_dir(filename,dst_dir,file_types,copy_or_remove="copy"):
filename当前文件的路径
dst_dir要迁移到的路径
file_types要过滤的文件类型
copy_or_remove复制或移动
# os.path.split切分路径为路径和文件名 如 c:/ 和a.txt
head_tail = os.path.split(filename)
# 如果是复制模式
if copy_or_remove =="copy":
# 遍历需要复制的文件类型
for file_type in file_types:
# 如果文件类型是需要复制的
if str(head_tail[1]).endswith(file_type):
print(f"当前需要复制的文件名为{filename}")
# 构建移动后的文件全路径
file_path_new = dst_dir+'\\' + head_tail[1]
# 复制文件到指定目录下
shutil.copyfile(filename, file_path_new)
print(f"复制:原文件{filename}--->新文件{file_path_new}")
# 如果是移动模型
elif copy_or_remove=="remove":
# 遍历需要复制的文件类型
for file_type in file_types:
print(f"当前需要移动的文件名为{filename}")
# 如果文件类型是需要复制的
if str(head_tail[1]).endswith(file_type):
# 构建移动后的文件全路径
file_path_new = dst_dir+'\\' + head_tail[1]
# 复制文件到指定目录下
# os.remove(file_path, file_path_new)
print(f"移动:原文件{file_path}--->新文件{file_path_new}")
else:
print("copy_or_remove的值为copy 或是 remove")
# 开始遍历
# 查看初级目录下的所有文件以及目录
continue_flag = False
def list_dir_by_level(file_path,dst_dir,file_types,copy_or_remove="copy"):
global continue_flag
# 遍历当前路径
dir_one = os.listdir(file_path)
for file in dir_one:
# 拼接绝对路径
abs_file_name = os.path.join(file_path,file)
# 如果路径为目标地址 跳过
if abs_file_name == dst_dir:
continue
# 跳过 指定路径
for filter_dir in filter_dirs:
if filter_dir in abs_file_name:
print(f"跳过包含{filter_dir}的目录-->{abs_file_name}")
continue_flag = True # 设置外层循环的标记
continue
if continue_flag:
continue_flag = False # 修改标记为False
continue
# if "data" in abs_file_name:
# # print(f"跳过包含data的目录-->{abs_file_name}")
# continue
# 过滤提取初级目录下的子目录
if os.path.isdir(abs_file_name):
# print(f"当前目录为{abs_file_name}")
list_dir_by_level(abs_file_name,dst_dir,file_types,copy_or_remove=copy_or_remove)
elif os.path.isfile(abs_file_name):
file_type_to_reduce_dir(abs_file_name,dst_dir,file_types,copy_or_remove=copy_or_remove)
list_dir_by_level(file_path,dst_dir,file_types)
输出为:
复制:原文件F:\XXX\20201762班-陈家豪\2020112808+童非+实习报告\2020112808+童非+实习报告.docx—>新文件F:\XXX\汇总\2020112808+童非+实习报告.docx 跳过包含code的目录–>F:\XXX\20201762班-陈家豪\2020112808+童非+实习报告\Code\productsWebForm\node_modules@babel\code-frame 跳过包含code的目录–>F:\XXX\20201762班-陈家豪\2020112808+童非+实习报告\Code\productsWebForm\node_modules@jridgewell\sourcemap-codec 跳过包含code的目录–>F:\XXX\20201762班-陈家豪\2020112808+童非+实习报告\Code\productsWebForm\node_modules\archy\test\non_unicode.js 跳过包含code的目录–>F:\XXX\20201762班-陈家豪\2020112808+童非+实习报告\Code\productsWebForm\node_modules\bl\node_modules\string_decoder 复制:原文件F:\XXX\20201762班-陈家豪\2020159316+汤正+实习报告\2020159316-汤正-实习报告.doc—>新文件F:\公司\20221124三峡大学培训\学 号+姓名+实习报告\20201762+实习报告\汇总\2020159316-汤正-实习报告.doc