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

达里亚

我有一个大目录,其中包含许多要排序的子目录,我想将特定的文件类型复制到新文件夹中,但是我想保留原始的子目录。

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

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

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

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关键字参数来使用内置函数执行所需的操作最棘手的部分是,如果给定的,它必须是一个可调用的是什么样的回报,在每个目录,应该被复制,而不是应该是什么。

但是,可以编写类似于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')

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

Git无法识别新文件夹的添加及其子目录

来自分类Dev

如果不存在,如何将更新的文件复制到新文件夹并创建目录作为源?

来自分类Dev

将特定文件批量复制到所有目录和子目录

来自分类Dev

如何改善将输出APK从Android项目复制到新文件夹的任务?

来自分类Dev

如何将文件从列表复制到新文件夹?

来自分类Dev

将子文件夹中的所有文件复制到新文件夹中

来自分类Dev

为什么我尝试将文件从Firebase Storage的根目录复制到新文件夹的代码无法正常工作?

来自分类Dev

如何使用Python将子文件夹和文件复制到新文件夹

来自分类Dev

如何将文件从列表复制到新文件夹?

来自分类Dev

将文本文件中列出的几个文件复制到新文件夹中

来自分类Dev

如何将文件复制到文件夹及其所有子目录中

来自分类Dev

Robocopy仅将更改的文件复制到新文件夹

来自分类Dev

将一组特定文件从一个目录复制到另一个目录,同时保留文件夹结构

来自分类Dev

如何将文件夹复制到以sysdate重命名的新文件夹?

来自分类Dev

将文件复制到子目录

来自分类Dev

将文件从目录树中的某处复制到文件夹

来自分类Dev

将顺序文件从多个文件夹复制到新文件夹中

来自分类Dev

如何将文件复制到子目录?

来自分类Dev

我可以浏览目录的子目录并将特定扩展名的文件复制到新文件夹吗?

来自分类Dev

将文件从一个目录复制到另一个目录,同时为每个文件创建一个新文件夹,并以该文件命名

来自分类Dev

将资产文件夹子目录复制到外部存储中的特定文件夹

来自分类Dev

批处理文件将某些文件类型从某些子目录复制到一个文件夹

来自分类Dev

如何使用批处理文件将特定子文件夹(如果存在)复制到备份文件夹中的新文件夹?

来自分类Dev

将目录和子目录中的特定文件复制到mac中的目标文件夹中

来自分类Dev

将子目录中的文件复制到只有 1 个文件扩展名的临时文件夹

来自分类Dev

bash shell 脚本:将文件夹内文件夹的特定内容从每个文件夹复制到桌面上的新文件夹

来自分类Dev

将文件复制到另一个文件夹,同时保留一个父目录

来自分类Dev

Powershell:将父文件夹中的所有子目录和内容复制到另一个文件夹目标

来自分类Dev

使用 Robocopy 更新功能将子目录中的所有文件复制到单个文件夹

Related 相关文章

  1. 1

    Git无法识别新文件夹的添加及其子目录

  2. 2

    如果不存在,如何将更新的文件复制到新文件夹并创建目录作为源?

  3. 3

    将特定文件批量复制到所有目录和子目录

  4. 4

    如何改善将输出APK从Android项目复制到新文件夹的任务?

  5. 5

    如何将文件从列表复制到新文件夹?

  6. 6

    将子文件夹中的所有文件复制到新文件夹中

  7. 7

    为什么我尝试将文件从Firebase Storage的根目录复制到新文件夹的代码无法正常工作?

  8. 8

    如何使用Python将子文件夹和文件复制到新文件夹

  9. 9

    如何将文件从列表复制到新文件夹?

  10. 10

    将文本文件中列出的几个文件复制到新文件夹中

  11. 11

    如何将文件复制到文件夹及其所有子目录中

  12. 12

    Robocopy仅将更改的文件复制到新文件夹

  13. 13

    将一组特定文件从一个目录复制到另一个目录,同时保留文件夹结构

  14. 14

    如何将文件夹复制到以sysdate重命名的新文件夹?

  15. 15

    将文件复制到子目录

  16. 16

    将文件从目录树中的某处复制到文件夹

  17. 17

    将顺序文件从多个文件夹复制到新文件夹中

  18. 18

    如何将文件复制到子目录?

  19. 19

    我可以浏览目录的子目录并将特定扩展名的文件复制到新文件夹吗?

  20. 20

    将文件从一个目录复制到另一个目录,同时为每个文件创建一个新文件夹,并以该文件命名

  21. 21

    将资产文件夹子目录复制到外部存储中的特定文件夹

  22. 22

    批处理文件将某些文件类型从某些子目录复制到一个文件夹

  23. 23

    如何使用批处理文件将特定子文件夹(如果存在)复制到备份文件夹中的新文件夹?

  24. 24

    将目录和子目录中的特定文件复制到mac中的目标文件夹中

  25. 25

    将子目录中的文件复制到只有 1 个文件扩展名的临时文件夹

  26. 26

    bash shell 脚本:将文件夹内文件夹的特定内容从每个文件夹复制到桌面上的新文件夹

  27. 27

    将文件复制到另一个文件夹,同时保留一个父目录

  28. 28

    Powershell:将父文件夹中的所有子目录和内容复制到另一个文件夹目标

  29. 29

    使用 Robocopy 更新功能将子目录中的所有文件复制到单个文件夹

热门标签

归档