Python小工具-复制嵌套目录下的多个word文档到指定目录

news2025/3/1 9:48:59

文章目录

  • Python小工具-复制嵌套目录下的多个word文档到指定目录
    • 需求
    • 原始数据
    • 工具实现思路
    • 代码实现
      • 1-6 配置项目
      • 7 定义file_type_to_reduce_dir函数完成文件复制或移动
      • 8 定义list_dir_by_level函数完成遍历
      • 调用函数并执行
    • 待改进地方
    • 完整代码
  • 自我反省

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
跳过包含code的目录–>F:\XXX\20201762班-陈家豪\2020159316+汤正+实习报告\code
跳过包含data的目录–>F:\公司\20221124三峡大学培 训\学号+姓名+实习报告\20201762+实习报告\20201762班-陈家豪\2020159316+汤正+实习报告\data

自我反省

著名心理学专家Jordan Peterson教授曾概括“伪勤奋”的4个表现,看看你中了几个?
1.花大量时间做事情中最容易的环节,还到处炫耀:没有功劳也有苦劳。
2.以“准备”的名义拖延,看上去很忙但事情没有任何进展。
3.从来不验证工作成果,不知道做得好做得坏,只顾闷头拉车,不会抬头看天。
4.读了很多书,但从不总结规律;即使总结了规律,也没有用到实践中。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/117880.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

全志 Linux 系统启动优化 启动优化速度方式 优化启动流程 优化uboot 优化kernel等

文章目录1 概述2 启动速度优化简介2.1 启动流程2.2 测量方法2.2.1 printk time2.2.2 initcall_debug2.2.3 bootgraph.2.2.4 bootchart2.2.5 gpio 示波器.2.2.6 grabserial.2.3 优化方法2.3.1 boot0启动优化2.3.1.1 非安全启动.2.3.1.2 安全启动2.3.2 uboot启动优化2.3.2.1 完全…

07、SpringCloud 系列:Alibaba - 介绍

SpringCloud 系列列表: 文章名文章地址01、Eureka - 集群、服务发现https://blog.csdn.net/qq_46023503/article/details/12831902302、Ribbon - 负载均衡https://blog.csdn.net/qq_46023503/article/details/12833228803、OpenFeign - 远程调用https://blog.csdn.…

一套ASP.NET优惠券领取微信小程序源码(前台+后台)

ASP.NET优惠券领取微信小程序源码(前台后台) 源码免费分享!需要源码学习可私信我。 一、源码特点 1、这是一个微信小程序对接淘宝的淘宝客api自助搜索优惠券领取程序,简单易学。 2、后台采用asp.netMvc框架开发、实现了调用阿里妈…

Java I/O(五)NIO应用之Netty

Netty 目录Netty1 Netty概览2 Netty核心组件2.1 Bootstrap和ServerBootStrap(启动引导类)2.2 Channel(网络操作抽象类)2.3 EventLoop(事件循环)2.4 EventLoopGroup(事件循环组)2.7 C…

【Vue】创建 Vue 实例与对象配置、容器与实例的关系、插值延伸和 Vue 开发工具的初步使用

创建 Vue 实例 引入 Vue 注意在 Head 中 <script type"text/javascript" src"./vue.js"></script>另一个 javascript 中创建 Vue 实例&#xff0c;注意在 Body 尾部 <script type"text/javascript">const x new Vue() <…

12. 目前常用的四种信道复用方式:()、()、()和() ---- 计算机网络

目前常用的四种信道服用方式&#xff1a;&#xff08;频分复用&#xff09;、&#xff08;时分复用&#xff09;、&#xff08;码分复用&#xff09;和&#xff08;波分复用&#xff09; 知识点 复用&#xff08;multiplexing&#xff09;&#xff1a;就是在一个信道上传输多路…

java SE阶段面试题

目录 1、Java 的数据类型有哪些&#xff1f; 2、变量的三要素是什么&#xff1f;变量使用有什么要求&#xff1f; 3、基本数据类型变量和引用数据类型变量有什么区别&#xff1f; 4、Java 的运算符有几种意思&#xff1f; 5、Java 的自增、自减运算符在自增变量前后有什么区…

《计算机网络》——第三章知识点

第三章思维导图 链路层的信道类型 一对一:点对点信道 —对多:广播信道 链路层要解决的问题 封装成帧 透明传输 差错检测密封&#xff0c;透气性差 封装成帧就是在一段数据的前后部分添加首部和尾部&#xff0c;这样就构成了一个帧。接收端在收到物理层上交的比特流后&#xff…

Pandas.to_csv()函数及全部参数使用方法一文详解+实例代码

目录 前言 一、基础语法与功能 二、参数说明和代码演示 1.path_or_buf 选择文件/文件路径写入 2.sep 指定分隔符 3.na_rep 指定缺少数据表示 4.float_format 指定浮点型字符串输出格式 5. columns 指定要写入的列 6.header 是否需要写入列名 7.index 是否写入行名称&am…

【实时数仓】Sugar拉取数据展示、品牌销售排行接口、品类销售占比接口和热门商品SPU排名接口的实现

文章目录一 Sugar拉取数据展示1 内网穿透&#xff08;1&#xff09;作用&#xff08;2&#xff09;工具&#xff08;3&#xff09;本机ip地址&#xff08;4&#xff09;花生壳配置2 配置组件二 品牌销售排行接口1 Sugar配置&#xff08;1&#xff09;图表配置&#xff08;2&…

2022《粤语好声音-乐队风暴》全国总决赛圆满收官!

2022年12月17日&#xff0c;由广东珠江、盛娱星汇海选联合主办的2022《粤语好声音-乐队风暴》全国总决赛在广州增城1978电影小镇正式拉开帷幕。从海选到全国总决赛&#xff0c;2022《粤语好声音-乐队风暴》在21座城市中&#xff0c;通过线上线下双模式开展&#xff0c;历时6个月…

OpManager 虚拟化管理

什么是虚拟化 虚拟化是创建计算资源的虚拟形式&#xff0c;如计算机、服务器或其他硬件组件&#xff0c;或基于软件的资源&#xff08;如操作系统&#xff09;。虚拟化最常见的示例是在操作系统安装期间对硬盘进行分区&#xff0c;其中物理硬盘驱动器被拆分为多个逻辑磁盘以提…

重点 |中级软件设计师易混淆知识点 (1)

本文章总结了软件设计师考试易混淆知识点&#xff01;&#xff01;&#xff01; 帮助大家更好的复习&#xff0c;希望能对大家有所帮助 比较长&#xff0c;放了部分&#xff0c;需要可私信&#xff01;&#xff01; 易混淆点1&#xff1a;原、反、补码的运算 1、原码&#x…

Технокубок 2021 - Финал C. Basic Diplomacy

翻译&#xff1a; Aleksey有&#x1d45b;个朋友。他现在也在度假&#xff0c;所以他有&#x1d45a;天来玩这款新的病毒式合作游戏!但由于它是合作的&#xff0c;阿列克谢将需要一个队友在每个&#x1d45a;天。 在这些日子里&#xff0c;每天都有一些朋友可以玩&#xff0c…

Spring 依赖注入

文章目录流程图依赖注入的方式手动注入自动注入XML的autowire自动注入autowire BY_NAME 与 BY_TYPE(已过时)执行时机&#xff1a;AUTOWIRE_BY_NAMEAUTOWIRE_BY_TYPEAutowired注解的处理(含Value&#xff0c;Inject)AutowiredAnnotationBeanPostProcessorresolveDependencyfindA…

机器学习——线性模型学习

线性回归 主要目标确定 如何确定w和b呢&#xff1f;关键在于如何衡量f(x)与y的差别 此种衡量误差的方法称为均方误差也称为欧式距离 求解w和b使上述方程最小化的过程称为线性回归模型的最小二乘”参数估计“ 多元线性回归 针对多个属性的数据集D&#xff0c;此时试图学得 …

DHCP学习

目录 DHCP基本认识和原理 场景一、同网段DHCP 场景二、不同段DHCP&#xff08;中继DHCP&#xff09; DHCP基本认识和原理 DHCP&#xff08;Dynamic Host Configuration Protocol动态主机协议&#xff09;。 作用&#xff1a;为局域网络中主机动态分发地址&#xff0c;以及…

INMP441麦克风芯片--支持I2S、ESP32

1.简介 INMP441是InvenSense公司推出的一款具有底部端口的高信噪比、低功耗、数字输出的全向MEMS麦克风&#xff0c;信噪比高达61dB&#xff0c;使其成为近场应用的绝佳选择。INMP441的电路结构如图所示&#xff0c;包括MEMS声音传感器、模数转换器&#xff08;ADC&#xff09…

人工智能的2022:技术的价值在于生产力

这里写自定义目录标题欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题&#xff0c;有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注…

孤独的照片(思维)

Farmer John 最近购入了 NN 头新的奶牛&#xff0c;每头奶牛的品种是更赛牛&#xff08;Guernsey&#xff09;或荷斯坦牛&#xff08;Holstein&#xff09;之一。 奶牛目前排成一排&#xff0c;Farmer John 想要为每个连续不少于三头奶牛的序列拍摄一张照片。 然而&#xff0…