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

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

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


需求

有多个文件目录,每个目录下都有多个文件和子目录,现在需要把这些目录中的word文档提取处理,并放到当前文件夹下,


原始数据

1480b732678b37e3a731ac7a0e8c2343_dadfb607c3264b97a44c04851a4a718a.png


每个班级中有多个人的目录,每个目录下有实习报告+原代码,现在需要把每个目录中的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


汇总后的文件如图

6ff51b66de08eb805f1d3726c5a12cac_7300604a34ef44feb66743789cafb644.png


待改进地方

如果目录内的文件重名,汇总后会覆盖,可以执行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.读了很多书,但从不总结规律;即使总结了规律,也没有用到实践中。

相关文章
|
10天前
|
存储 安全 数据安全/隐私保护
打造安全防线!Python AES&RSA加密工具,黑客绕道走的秘籍
【9月更文挑战第9天】随着数字化时代的到来,信息安全问题日益凸显。本文将介绍如何使用Python结合AES与RSA两种加密算法,构建强大的加密工具。AES以其高效性和强安全性著称,适用于大量数据的快速加密;RSA作为非对称加密算法,在加密小量数据及实现数字签名方面表现卓越。通过整合两者,可以构建既安全又灵活的加密系统。首先,需要安装pycryptodome库。接着,实现AES加密与解密功能,最后利用RSA加密AES密钥,确保其安全传输。这种设计不仅提高了数据传输效率,还增强了密钥交换的安全性,为敏感数据提供坚实保护。
139 43
|
16天前
|
Python
Python的编辑工具-Jupyter notebook实战案例
这篇博客介绍了Jupyter Notebook的安装和使用方法,包括如何在本地安装Jupyter、启动和使用Jupyter Notebook进行编程、文档编写和数据分析,以及如何执行和管理代码单元(Cell)的快捷键操作。
26 4
Python的编辑工具-Jupyter notebook实战案例
|
20天前
|
安全 项目管理 Python
使用Python shutil库进行文件和目录操作
使用Python shutil库进行文件和目录操作
使用Python shutil库进行文件和目录操作
|
3天前
|
机器学习/深度学习 算法 开发工具
Python Web开发工具
Python Web开发工具
13 3
|
10天前
|
消息中间件 网络协议 Python
工具人逆袭!掌握Python IPC,让你的进程从此告别单打独斗
【9月更文挑战第9天】你是否曾遇到多个Python程序像孤岛般无法通信,导致数据孤立、任务难协同的问题?掌握进程间通信(IPC)技术,可助你打破这一僵局。IPC是不同进程间传递数据或信号的机制,在Python中常用的方法有管道、消息队列、共享内存及套接字等。其中,管道适用于父子或兄弟进程间简单数据传递;套接字则不仅限于本地,还能在网络间实现复杂的数据交换。通过学习IPC,你将能设计更健壮灵活的系统架构,成为真正的编程高手。
15 3
|
16天前
|
安全 数据挖掘 Python
Python的打包工具(setup.py)实战篇
关于如何使用Python的setup.py工具打包Python项目的实战教程。
15 0
Python的打包工具(setup.py)实战篇
|
20天前
|
存储 缓存 C语言
|
22天前
|
JSON JavaScript API
用Python编写小工具下载OSM路网数据
用Python编写小工具下载OSM路网数据
|
19天前
|
测试技术 API 开发者
Python 魔法:打造你的第一个天气查询小工具自动化测试框架的构建与实践
【8月更文挑战第31天】在这篇文章中,我们将一起踏上编程的奇妙旅程。想象一下,只需几行代码,就能让计算机告诉你明天是否要带伞。是的,你没有听错,我们将用Python这把钥匙,解锁天气预报的秘密。不论你是编程新手还是想拓展技能的老手,这篇文章都会为你带来新的视角和灵感。所以,拿起你的键盘,让我们一起创造属于自己的天气小工具吧!
|
22天前
|
存储 前端开发 关系型数据库
秀啊,用Python快速开发在线数据库更新修改工具
秀啊,用Python快速开发在线数据库更新修改工具