Как я могу копировать файлы разных типов в Python, сохраняя при этом их структуру каталогов

Я новичок в использовании Spyder 2.3.0 и Python 3.4.1

У меня есть структура каталогов с подкаталогами.

В отличие от других примеров в Интернете, я хочу выбрать несколько типов файлов и скопировать структуру каталогов. Я попробовал ниже, и это работает, но это занимает только один тип файла одновременно и "copytreeс "(это будет очень медленно).

Есть ли способ или другой способ упростить это, чтобы сделать это быстрее?

Я думал, что хочу сделать:

Составьте исчерпывающий список типов файлов и местоположений (проход по структуре каталогов)

Например, заканчивая

fileExt = [".txt", ".doc", ".docx", ".xls",".xlsx", ".ppt", ".pptx", ".m", ".xmcd", ".pdf " ]

Тогда с этим списком просто "shutil.copytree"

Любой совет с благодарностью.

  srcDir  = 'c:/a/src/dir/'
  dirName = 'c:/a/dest/dir/'


import os
import shutil

##################################################################################

dstDir = os.path.abspath(dirName)

def ignore_list(path, files):

    filesToIgnore = []

    for fileName in files:

        fullFileName = os.path.join(os.path.normpath(path), fileName)

        if not os.path.isdir(fullFileName) and not fileName.endswith('.txt') :

            filesToIgnore.append(fileName)

    return filesToIgnore

# start of script

shutil.copytree(srcDir, dstDir, ignore=ignore_list)
####################################################################################################################################################################

dstDir = os.path.abspath(dirName)

def ignore_list(path, files):

    filesToIgnore = []

    for fileName in files:

        fullFileName = os.path.join(os.path.normpath(path), fileName)

        if not os.path.isdir(fullFileName) and not fileName.endswith('.docx') :


            filesToIgnore.append(fileName)

    return filesToIgnore

# start of script

shutil.copytree(srcDir, dstDir, ignore=ignore_list)

####################################################

Скопируйте и вставьте, изменяя "конец с ('. Docx'):"

2 ответа

Решение

Мы можем выполнить ваш метод "ignore_list" немного больше

valid_formats = ["txt", "doc", "docx", "xls","xlsx", "ppt", "pptx", "m", "xmcd", "pdf "]

import timeit
import os.path as op

def ignore_list(path, files):
    dag_path = [op.join(op.normpath(path), f) for f in files]
    return [ff for ff in dag_path if not op.isdir(ff) and ff.split(".")[-1] not in valid_formats]

start = timeit.default_timer()
ignore = ignore_list(path, files)
print ("Time: {0}".format(str(timeit.default_timer()-start)))

Это работает, я знаю, это не красиво, но это работает

srcDir  = 'c:/a/src/dir/
dstDir = 'c:/a/dest/dir/'


A01= '.doc'
A02= '.docx'
A03= '.xls'
A04= '.xlsx'
A05= '.ppt'
A06= '.pptx'
A07= '.m'
A08= '.xmcd'
A09= '.inp'
A10= '.pdf'
A11= '.DOC'
A12= '.DOCX'
A13= '.XLS'
A14= '.XLSX'
A15= '.PPT'
A16= '.PPTX'
A17= '.M'
A18= '.XMCD'
A19= '.INP'
A20= '.PDF'



import os
import shutil

#########################################################################################################


def ignore_list(path, files):

    filesToIgnore = []

    for fileName in files:

        fullFileName = os.path.join(os.path.normpath(path), fileName)

        if not os.path.isdir(fullFileName) and not fileName.endswith(A01) and not fileName.endswith(A02) and not fileName.endswith(A03) and not fileName.endswith(A04) and not fileName.endswith(A05) and not fileName.endswith(A06) and not fileName.endswith(A07) and not fileName.endswith(A08) and not fileName.endswith(A09) and not fileName.endswith(A10) and not fileName.endswith(A11) and not fileName.endswith(A12) and not fileName.endswith(A13) and not fileName.endswith(A14) and not fileName.endswith(A15) and not fileName.endswith(A16) and not fileName.endswith(A17) and not fileName.endswith(A18) and not fileName.endswith(A19) and not fileName.endswith(A20) :


            filesToIgnore.append(fileName)

    return filesToIgnore




shutil.copytree(srcDir, dstDir, ignore=ignore_list)

#########################################################################################################
Другие вопросы по тегам