Как выполнить нерекурсивное копирование с использованием python - PullRequest
0 голосов
/ 29 августа 2018

Мне нужно скопировать файлы с определенными шаблонами. Мне нужно выполнить нерекурсивное копирование в данном каталоге с помощью 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'))

Ответы [ 2 ]

0 голосов
/ 29 августа 2018

Это скорее взлом, но все файлы в каталоге будут скопированы в каталог назначения не рекурсивно. Вы можете использовать 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)
0 голосов
/ 29 августа 2018

Убедитесь, что каталог назначения существует первым. Затем создайте список всех файлов, которые нужно игнорировать, с помощью 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)
...