将特定文件复制到新文件夹,同时保留原始子目录树

2023-11-29

我有一个大目录,其中有许多子目录,我正在尝试对其进行排序,我正在尝试将特定文件类型复制到新文件夹,但我想保留原始子目录。

def copyFile(src, dest):
try:
    shutil.copy(src,dest)
except shutil.Error as e:
    print('Error: %s' % e)
except IOError as e:
    print('Error: %s' % s.strerror)


for root, directories, files in os.walk(directory):
    for directoryname in directories:
        dirpath = os.path.join(root,directoryname)
        dir_paths.append(dirpath)
        dir_names.append(directoryname)

        if not os.listdir(dirpath): #Cheching if directory is empty
            print("Empty")
            EmptyDirs.append(directoryname) #Add directory name to empty directory list
            EmptyDirPath.append(dirpath)
        else:
            pass

    for filename in files:
        filepath = os.path.join(root,filename)
        file_paths.append(filepath)
        file_names.append(filename)

    if filename.lower().endswith(".sldasm"):
            print(filename.encode('utf8'))
            SolidModels.append(filename)
            copyFile(filepath,dest)
    elif filename.lower().endswith(".sldprt"):
            print(filename.encode('utf8'))
            SolidModels.append(filename)
            copyFile(filepath,dest)
    else:
        pass

这是我现在使用的代码,但它只是复制文件,而不复制它们原来所在的子目录,因此它们在新文件夹中完全没有组织。

这是使用复制树的新代码,但是现在不会复制特定文件,只有子目录会复制。

def copytree(src, dst, symlinks=False, ignore=None):
    names = os.listdir(src)
    if ignore is not None:
        ignored_names = ignore(src, names)
    else:
        ignored_names = set()

os.makedirs(dst)
errors = []

for name in names:
    if name in ignored_names:
        continue

    srcname = os.path.join(src, name)
    dstname = os.path.join(dst, name)

    try:
        if symlinks and os.path.islink(srcname):
            linkto = os.readlink(srcname)
            os.symlink(linkto, dstname)
        elif os.path.isdir(srcname):
            copytree(srcname, dstname, symlinks, ignore)
        else:
            if src is "*.sldasm":
                copy2(srcname, dstname)
            elif src is "*.sldprt":
                copy2(srcname, dstname)

    except (IOError, os.error) as why:
            errors.append((srcname, dstname, str(why)))

您可以使用内置功能做您想做的事情shutil.copytree()通过使用(滥用?)其可选功能ignore关键字参数。棘手的部分是,如果给定,它必须是一个可调用的,返回每个目录中应该返回的内容not被复制,而不是应该被复制。

但是,可以编写类似于以下的工厂函数shutil.ignore_patterns()创建一个执行所需操作的函数,并将其用作ignore关键字参数的值。

首先返回的函数通过fnmatch.filter()函数,然后将它们从给定目录中的所有内容列表中删除,除非它们是子目录名称,在这种情况下,它们将被保留以供以后的[递归]处理。 (这就是让它复制整个树的原因,以及您尝试编写自己的树时可能出现的问题copytree()功能)。

#!/usr/bin/env python
# -*- coding: utf-8 -*-
# Works in Python 2.7 & 3.x

import fnmatch
from os.path import isdir, join

def include_patterns(*patterns):
    """ Function that can be used as shutil.copytree() ignore parameter that
    determines which files *not* to ignore, the inverse of "normal" usage.

    This is a factory function that creates a function which can be used as a
    callable for copytree()'s ignore argument, *not* ignoring files that match
    any of the glob-style patterns provided.

    ‛patterns’ are a sequence of pattern strings used to identify the files to
    include when copying the directory tree.

    Example usage:

        copytree(src_directory, dst_directory,
                 ignore=include_patterns('*.sldasm', '*.sldprt'))
    """
    def _ignore_patterns(path, all_names):
        # Determine names which match one or more patterns (that shouldn't be
        # ignored).
        keep = (name for pattern in patterns
                        for name in fnmatch.filter(all_names, pattern))
        # Ignore file names which *didn't* match any of the patterns given that
        # aren't directory names.
        dir_names = (name for name in all_names if isdir(join(path, name)))
        return set(all_names) - set(keep) - set(dir_names)

    return _ignore_patterns


if __name__ == '__main__':

    from shutil import copytree, rmtree
    import os

    src = r'C:\vols\Files\PythonLib\Stack Overflow'
    dst = r'C:\vols\Temp\temp\test'

    # Make sure the destination folder does not exist.
    if os.path.exists(dst) and os.path.isdir(dst):
        print('removing existing directory "{}"'.format(dst))
        rmtree(dst, ignore_errors=False)

    copytree(src, dst, ignore=include_patterns('*.png', '*.gif'))

    print('done')
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

将特定文件复制到新文件夹,同时保留原始子目录树 的相关文章

  • Python dict 到 DataFrame Pandas - 级别

    几个月前 Romain X 在这个问题上帮了我很多忙 Python 字典到 DataFrame Pandas https stackoverflow com questions 32770359 python dict to datafra
  • 如何使用 Julia 查找矩阵中的连通分量

    假设我有以下矩阵 此处用 Julia 语言定义 mat 1 1 0 0 0 1 1 0 0 0 0 0 0 0 1 0 0 0 1 1 将一组值为 1 的相邻元素视为一个 分量 如何识别该矩阵有 2 个分量以及每个分量由哪些顶点组成 对于矩
  • 将 3d NumPy 数组重塑为 2d NumPy 数组时遇到问题

    我正在研究图像处理问题 我的数据以 3 维 NumPy 数组的形式呈现 其中 x y z 条目是图像 z 的 x y 像素 数值强度值 有 100000 张图像 每张图像为 25x25 因此 数据矩阵的大小为 25x25x10000 我试图
  • 在python中合并3个dict()

    如果多个字典之间有公共字符串 是否有逻辑合并多个字典的方法 即使这些公共字符串在一个 dict 的值与另一个 dict 的键之间匹配 我在 SO 上看到了很多类似的问题 但似乎没有一个问题能解决我将 较低级别文件 中的多个键与较高键 值中的
  • skpy 向包含用户提及的组发送消息

    我需要在发送给 Skype 群组的消息中提及特定用户 我可以使用 skpy 轻松发送消息 但不知道如何在消息中提及某人 sk Skype userid paasword SendMsgTo sk chats group id SendMsg
  • 使用 scikit-learn 在朴素贝叶斯分类器中混合类别数据和连续数据

    我正在使用 Python 中的 scikit learn 开发分类算法来预测某些客户的性别 除此之外 我想使用朴素贝叶斯分类器 但我的问题是我混合了分类数据 例如 在线注册 接受电子邮件通知 等 和连续数据 例如 年龄 长度 会员资格 等
  • 当类的任何属性被修改时,类如何运行某些函数?

    是否有一些通用方法可以让类在以下情况下运行函数 any它的属性被修改了吗 我想知道是否可以运行某些子进程来监视类的更改 但也许有一种方法可以继承class并修改一些on change函数是 Python 类的一部分 有点像默认的 repr
  • 在 Tkinter 中调整另一个小部件内的一个小部件的大小

    我正在开发穆斯堡尔光谱 化学 的模拟软件 但在设计 UI 时 我在使用父窗口小部件调整子窗口小部件的大小时遇到 了问题 当窗口最大化时 父框架会填充额外的空间 但子窗口小部件不会更改其大小 from Tkinter import impor
  • 无法解析 ReferenceProperty -- App Engine

    我遇到了一个错误 无法找出其根本原因 错误如下 ReferenceProperty 无法解析 u StatusLog STATUSLOGSID 此错误仅有时发生 大约一天一次或两次 生成此错误的脚本成功的次数多于失败的次数 该错误最奇怪的事
  • 令人困惑的问题>> FileNotFoundError:[Errno 2]没有这样的文件或目录:

    这个问题让我很困惑 也许问题出在代码上 希望你看一下 with open training images labels path r as file lines file readlines 他说该文件不存在 FileNotFoundErr
  • Keras 中的条件批量归一化

    我正在尝试在 Keras 中实现条件批量标准化 我假设我必须创建一个自定义层 因此 我从正常化 https github com keras team keras blob master keras layers normalization
  • 群组名称不能以数字开头?

    看来我不能使用像这样的正则表达式 P lt 74xxx gt 0 9 重新打包会引发错误 sre constants error bad character in group name u 74xxx 我似乎无法使用以数字开头的组名称 为什
  • argparse add_argument 别名

    有没有办法使用 argparse 创建别名 例如 我想做这样的事情 parser add argument foo parser add argument alias bar foo 也就是说 使用 bar应该相当于使用 foo 您可以简单
  • python中终止进程的跨平台方法

    当我尝试使用 subprocess Popen terminate 或 Kill 命令终止 Windows 中的进程时 出现访问被拒绝错误 如果文件不再存在 我真的需要一种跨平台的方式来终止进程 是的 我知道这不是做我正在做的事情的最优雅的
  • 从 Java 调用 Python 代码时出现问题(不使用 jython)

    我发现这是从 java 运行 使用 exec 方法 python 脚本的方法之一 我在 python 文件中有一个简单的打印语句 但是 我的程序在运行时什么也没做 它既不打印Python文件中编写的语句 也不抛出异常 程序什么都不做就终止了
  • 深度学习——一些关于caffe的幼稚问题

    我试图了解 caffe 的基础知识 特别是与 python 一起使用 我的理解是模型定义 比如给定的神经网络架构 必须包含在 prototxt file 当您使用数据训练模型时 prototxt 您将权重 模型参数保存到 caffemode
  • 无法从 celery 信号连接到 celery 任务?

    我正在尝试连接task2 from task success signal from celery signals import task success from celery import Celery app Celery app t
  • 确定 pyInstaller 生成的 Python EXE 中的应用程序路径

    我有一个驻留在单个 py 文件中的应用程序 我已经能够让 pyInstaller 将其成功捆绑到 Windows 的 EXE 中 问题是 应用程序需要一个 cfg 文件 该文件始终直接位于应用程序旁边的同一目录中 通常 我使用以下代码构建路
  • 使用自定义层运行 Keras 模型时出现问题

    我目前正在攻读学士学位论文FIIT STU https www fiit stuba sk en html page id 749 其主要目标是尝试复制和验证以下结果study http arxiv org abs 2006 00885 这
  • Python tkinter:在组合框中使用“文本变量”似乎没用

    使用textvariable在 tkinter 中创建组合框时的属性似乎完全没用 有人可以解释一下目的是什么吗 我查看了 Tcl 文档 它说textvariable用于设置默认值 但看起来在 tkinter 中您只需使用 set方法来做到这

随机推荐

  • 将数组合并到对象中到 MongoDB 中

    说明 我必须数组TV and values我想将其合并为对象一侧的一个数组 TV values将作为一个数组输出 TV T 2018 05 05T09 00 00 000Z V 1 3 T 2018 05 05T09 00 00 000Z
  • 如何将多行输出连接到一行?

    如果我运行命令cat file grep pattern 我得到很多行输出 如何将所有行连接成一行 有效地替换每一行 n with 以 后跟空格 cat file grep pattern xargs sed s n g不适合我 Use t
  • 对齐 Highcharts 中图例中的文本

    目前图例将文本左对齐 即 表示项目标签 在大多数情况下只是不同的颜色 Legend item 2 Legend item 3 Legend item 244 我希望它能像这样 Legend item 2 Legend item 3 Lege
  • 检查map中的元素是否存在

    我有一张表格的地图map
  • 埃拉托斯特尼筛法问题 Java

    我的作业有一个问题 需要使用数组 我需要创建埃拉托斯特尼筛法算法并打印出所有素数 我很困惑 因为据我所知 我的操作顺序是正确的 这是代码 Declare the array boolean numbers new boolean 1000
  • 在链表的开头插入新节点

    在 C 语言的简单链表实现中 我无法找出一行名为 insert 的函数 它需要一个字符并按字母顺序添加到链接列表中 该行是关于当列表为空时创建一个新节点 由于列表上只有一个节点 因此该行应该像我评论的那样 我错了吗 void insert
  • 复杂MySQL查询错误结果

    我正在尝试构建复杂的 mysql 查询 但它返回错误的结果 SELECT b name AS batch name b id AS batch id COUNT DISTINCT s id AS total students COALESC
  • 如何在我的应用程序中将状态栏设置为白色背景和黑色文本(黑色图标)

    我想在我的应用程序中将状态栏设置为白色背景和黑色文本 和黑色图标 我发现一些应用程序可以做到这一点 但是从谷歌搜索 我找不到任何解决方案来做到这一点 有很多关于如何设置状态栏颜色的解决方案 还有像 SystemBarTint 它只能设置背景
  • 使用 jQuery 获取当前 URL? [复制]

    这个问题在这里已经有答案了 我正在使用 jQuery 如何获取当前 URL 的路径并将其分配给变量 示例网址 http localhost menuname de foo bar amp number 0 要获取路径 您可以使用 var p
  • 如何通过脚本创建 crontab

    我需要通过运行来设置服务器的脚本添加一个 cron 作业 我目前正在使用Ubuntu 我可以用crontab e但这将打开一个编辑器来编辑当前的 crontab 我想以编程方式执行此操作 可以这样做吗 这是一个不使用 不要求新作业位于文件中
  • 如何在循环遍历向量时从向量中删除元素?

    我正在循环遍历一个带有循环的向量 例如for int i 0 i lt vec size i 在此循环中 我检查该向量索引处元素的条件 如果某个条件为真 我想删除该元素 如何在循环遍历向量元素时删除向量元素而不崩溃 从 STL 容器中删除满
  • Python - 在列表理解中保留计数器

    是否可以为以下循环编写列表理解 m counter 0 for i x in enumerate l if x field something counter 1 m append counter i 我不知道如何增加列表理解中的计数器 你
  • Symfony - 未找到表单请求的 url

    我正在从事 symfony 项目 我正在与一个不会重定向到自己页面的表单作斗争 action 属性设置为 method 设置为 post 在这种情况下 它应该调用同一页面 但我会以 404 页面结束 这是我的页面在操作文件中的代码 公共函数
  • 无法识别的选择器发送到实例

    我向核心数据支持的 UITableView 添加了索引搜索 搜索工作正常 但是导航回 tableView 后出现此错误 NSSQLRow controllerDidChangeContent 无法识别的选择器发送到实例 0x815edf0
  • javascript - 在单击再次起作用之前需要 onclick 走完全程

    我有这个 javascript 函数 我使用它 当单击时会移动一定的距离 这是在使用大约 7 个 div 的从左到右的滚动条中使用的 我的问题是 在再次使用点击之前 如何让点击先走完整距离 问题是 如果用户快速单击箭头按钮 它会重置距离 有
  • 在属性窗口中更改自定义属性时不会保存

    我为 DataGridView 创建了一个自定义列 原因是我想向列添加属性 类型 我右键单击 DataGridView 并选择 编辑列 然后 当我选择作为自定义列类型的列时 我可以编辑该属性 但如果我在编辑后单击 确定 然后再次转到 编辑列
  • iOS 8 中 UIKeyboardWillShowNotification 的行为是否有变化?

    我有一个简单的UIView块动画 用于在键盘显示时将一组文本字段动画化到视图中 并在键盘隐藏时将它们动画化回来 这在 iOS 6 和 7 中工作得很好 但现在我得到了不正确的行为 这一切都表明了一些变化UIKeyboardWillShowN
  • 查询包含对不同数据上下文中定义的项目的引用

    我在 Stackoverflow 上阅读了其他几篇文章 但我的问题很简单且不同 我有 2 个独立的数据库 这就是为什么我有两个独立的 Datacontext 这是我的查询 我在其中传递参数并将其绑定到我的 GridView if Sessi
  • Ruby/Rails - 如何根据十进制进行验证?

    如何根据小数位数进行验证 例如 假设我们要存储小数点后最多 2 位小数的酒店评级 4 34 3 76 ETC 我在网上读到了基于您与列绑定的精度 比例截断的 sqlite 因此 如果您的精度为 3 小数位数为 2 并输入 1 34567 则
  • 将特定文件复制到新文件夹,同时保留原始子目录树

    我有一个大目录 其中有许多子目录 我正在尝试对其进行排序 我正在尝试将特定文件类型复制到新文件夹 但我想保留原始子目录 def copyFile src dest try shutil copy src dest except shutil