如何在保留其目录结构的同时在Python中复制不同的文件类型

时间:2016-11-23 08:45:47

标签: python operating-system shutil copytree

我是使用Spyder 2.3.0和Python 3.4.1的新手

我有一个带子目录的目录结构。

与Web上的其他示例不同,我想选择多种文件类型并复制目录结构。我在下面尝试了它可以工作,但它一次只需要一种文件类型,并且“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)

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

复制并粘贴更改“endswith(' .docx'):”

2 个答案:

答案 0 :(得分: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)))

答案 1 :(得分: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)

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