Python shutil copytree:使用ignore函数保留特定的文件类型 [英] Python shutil copytree: use ignore function to keep specific files types
问题描述
我试图弄清楚如何将具有子文件夹的源目录中的CAD工程图(".dwg",.dxf")复制到目标目录,并保持原始目录和子文件夹的结构.
I'm trying to figure out how to copy CAD drawings (".dwg", ".dxf) from a source directory with subfolders to a destination directory and maintaining the original directory and subfolders structure.
- 原始目录:H:\ Tanzania ... \ Bagamoyo_Single_line.dwg
- 源目录:H:\ CAD \ Tanzania ... \ Bagamoyo_Single_line.dwg
我在以下帖子中的 @martineau 中找到了以下答案:
I found the following answer from @martineau within the following post: Python Factory Function
from fnmatch import fnmatch, filter
from os.path import isdir, join
from shutil import copytree
def include_patterns(*patterns):
"""Factory function that can be used with copytree() ignore parameter.
Arguments define a sequence of glob-style patterns
that are used to specify what files to NOT ignore.
Creates and returns a function that determines this for each directory
in the file hierarchy rooted at the source directory when used with
shutil.copytree().
"""
def _ignore_patterns(path, names):
keep = set(name for pattern in patterns
for name in filter(names, pattern))
ignore = set(name for name in names
if name not in keep and not isdir(join(path, name)))
return ignore
return _ignore_patterns
# sample usage
copytree(src_directory, dst_directory,
ignore=include_patterns('*.dwg', '*.dxf'))
更新:18:21.以下代码按预期工作,但我想忽略不包含任何include_patterns(' .dwg',' .dxf')
Updated: 18:21. The following code works as expected, except that I'd like to ignore folders that don't contain any include_patterns('.dwg', '.dxf')
推荐答案
shutil
已经包含一个函数ignore_pattern
,因此您不必提供自己的函数.直接来自文档:
shutil
already contains a function ignore_pattern
, so you don't have to provide your own. Straight from the documentation:
from shutil import copytree, ignore_patterns
copytree(source, destination, ignore=ignore_patterns('*.pyc', 'tmp*'))
这将复制除.pyc
文件和文件以外的所有内容,或者
名称以tmp.
This will copy everything except .pyc
files and files or
directories whose name starts with tmp.
解释发生的事情有些棘手(并非严格必要):ignore_patterns
返回函数_ignore_patterns
作为其返回值,该函数作为参数填充到copytree
中,并且copytree
调用可以根据需要使用此函数,因此您不必知道或不在乎如何调用此函数_ignore_patterns
.这仅表示您可以从复制中排除某些不需要的草稿文件(例如*.pyc
).函数_ignore_patterns
的名称以下划线开头的事实表明,该函数是您可能会忽略的实现细节.
It's a bit tricky (and not strictly necessairy) to explain what's going on: ignore_patterns
returns a function _ignore_patterns
as its return value, this function gets stuffed into copytree
as a parameter, and copytree
calls this function as needed, so you don't have to know or care how to call this function _ignore_patterns
. It just means that you can exclude certain unneeded cruft files (like *.pyc
) from being copied. The fact that the name of the function _ignore_patterns
starts with an underscore is a hint that this function is an implementation detail you may ignore.
copytree
期望文件夹destination
尚不存在.一旦copytree
开始工作,此文件夹及其子文件夹就存在了,copytree
知道如何处理它.
copytree
expects that the folder destination
doesn't exist yet. It is not a problem that this folder and its subfolders come into existence once copytree
starts to work, copytree
knows how to handle that.
现在编写include_patterns
的目的是相反的:忽略未明确包括的所有内容.但是它的工作方式相同:您只要调用它,它就会在后台返回一个函数,而coptytree
知道该函数的作用:
Now include_patterns
is written to do the opposite: ignore everything that's not explicitly included. But it works the same way: you just call it, it returns a function under the hood, and coptytree
knows what to do with that function:
copytree(source, destination, ignore=include_patterns('*.dwg', '*.dxf'))
这篇关于Python shutil copytree:使用ignore函数保留特定的文件类型的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!