0

I'm new to using Spyder 2.3.0 and Python 3.4.1

I have a directory structure with sub directories.

Unlike other examples on the web I want to select multiple file types and copy the directory structure across. I have tried below and it works but it takes only one file type at a time and “<code>copytree’s” across (it’s going to be very slow).

Is there a way or different way to streamline this to make it faster?

What I was thinking I wanted to do was:

Make a comprehensive list of file types and locations (walking through directory structure)

For example ending with

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

Then with that list simply “<code>shutil.copytree”</p>

Any advice greatly appreciated.

  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)

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

Copy and paste changing “endswith('.docx') :”</p>

4

2 回答 2

0

这行得通,我知道它不漂亮,但它行得通

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)

#########################################################################################################
于 2016-11-23T12:46:44.563 回答
0

我们可以多执行你的“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)))
于 2016-11-23T09:26:29.087 回答