如何使用python执行非递归复制

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何使用python执行非递归复制相关的知识,希望对你有一定的参考价值。

我需要复制具有某些模式的文件。我需要使用shutil在给定目录上执行非递归副本。我尝试了下面给出的代码,执行递归复制。是否有任何选项可以在其中指定执行非递归副本。

    from fnmatch import fnmatch, filter
    from os.path import isdir, join
    from shutil import copytree, ignore_patterns

    src_directory = r'PATH'
    dst_directory = r'PATH'
    copytree(src_directory, ignored_directory,ignore=ignore_patterns('*.txt'))
答案

确保目标目录首先存在。然后使用glob.glob创建要忽略的所有文件的列表。然后遍历src目录中的所有文件和目录,并将每个文件复制到dst目录(如果它是文件且不在ignore列表中):

import os, shutil, glob
src = 'my_dir'
dst = 'my_dir_cp'

try:
    os.mkdir(dst)
except FileExistsError:
    pass

ignore = glob.glob(os.path.join(src, '*.txt'))
for file in os.listdir(src):
    file = os.path.join(src, file)
    if file not in ignore and os.path.isfile(file):
        shutil.copy(file, dst)

一个完整的例子:

$ ls my_dir
bob  cat.txt  fish  jim
$ python -q
>>> import os, shutil, glob
>>> src = 'my_dir'
>>> dst = 'my_dir_cp'
>>> 
>>> try:
...     os.mkdir(dst)
... except FileExistsError:
...     pass
... 
>>> ignore = glob.glob(os.path.join(src, '*.txt'))
>>> for file in os.listdir(src):
...     file = os.path.join(src, file)
...     if file not in ignore and os.path.isfile(file):
...         shutil.copy(file, dst)
... 
'my_dir_cp/jim'
'my_dir_cp/bob'
>>> 
$ ls my_dir_cp
bob  jim

如果你想能够忽略多个glob模式,那么你可以glob.glob中的每一个并将结果连接在一起(在列表理解中):

import os, shutil, glob
src = 'my_dir'
dst = 'my_dir_cp'

try:
    os.mkdir(dst)
except FileExistsError:
    pass

patterns_to_ignore = ['*.txt', '*.bat']
ignore = [e for p in patterns_to_ignore for e in glob.glob(os.path.join(src, p))]
for file in os.listdir(src):
    file = os.path.join(src, file)
    if file not in ignore and os.path.isfile(file):
        shutil.copy(file, dst)
另一答案

这更像是一个hack,但会将目录中的所有文件非递归地复制到目标目录。您可以使用glob或regex来忽略文件 -

import re

def copytree(src, dst):
     for item in [f for f in os.listdir(src) if os.path.isfile(os.path.join(src, f)) if not re.match(f, '[.]txt$')]:
         s = os.path.join(src, item)
         d = os.path.join(dst, item)
         shutil.copy2(s, d)

以上是关于如何使用python执行非递归复制的主要内容,如果未能解决你的问题,请参考以下文章

python汉诺塔非递归

python使用上下文对代码片段进行计时,非装饰器

如何增加 Python 中的最大递归深度? [复制]

如何使用事件侦听器来加载动画片段的循环

java 如何递归遍历多重目录下的指定格式文件复制到目标目录并改格式

递归如何转换为非递归