为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

牧羊人nacy 2021-06-05 14:23:52
我需要复制具有某些模式的文件。我需要使用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'))
查看完整描述

3 回答

?
一只名叫tom的猫

TA贡献1906条经验 获得超3个赞

首先确保目标目录存在。然后创建要忽略的所有文件的列表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)


查看完整回答
反对 回复 2021-06-06
?
慕后森

TA贡献1802条经验 获得超5个赞

这更像是一种黑客攻击,但会将目录中的所有文件以非递归方式复制到目标目录。您可以使用 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)


查看完整回答
反对 回复 2021-06-06
  • 3 回答
  • 0 关注
  • 162 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信