获取与 fnmatch 不匹配的元素

Posted

技术标签:

【中文标题】获取与 fnmatch 不匹配的元素【英文标题】:Get also elements that don't match fnmatch 【发布时间】:2012-01-28 12:57:33 【问题描述】:

我正在使用递归 glob 来查找文件并将其从驱动器复制到另一个驱动器

def recursive_glob(treeroot, pattern):
   results = []
   for base, dirs, files in os.walk(treeroot):

      goodfiles = fnmatch.filter(files, pattern)
      results.extend(os.path.join(base, f) for f in goodfiles)

return results

工作正常。但我也想访问与过滤器不匹配的元素。

有人可以提供帮助吗?我可以在循环中构建一个正则表达式,但必须有一个更简单的解决方案,对吧?

【问题讨论】:

【参考方案1】:

如果顺序无关紧要,请使用集合:

goodfiles = fnmatch.filter(files, pattern)
badfiles = set(files).difference(goodfiles)

【讨论】:

【参考方案2】:

os.walk 循环内的另一个循环也可以使用:

goodfiles = []
badfiles = []
for f in files:
  if fnmatch.fnmatch(f, pattern):
    goodfiles.append(f)
  else:
    badfiles.append(f)

注意:使用此解决方案,您只需遍历文件列表一次。其实os.path.join部分可以移到上面的循环中。

【讨论】:

以上是关于获取与 fnmatch 不匹配的元素的主要内容,如果未能解决你的问题,请参考以下文章

python--fnmatch

fnmatch 和递归路径匹配 `**`

Python 2.7 fnmatch 不编辑文本

Python3标准库:fnmatch UNIX式glob模式匹配

Python——模块——fnmatch(文件名对比)

Python: 用shell通配符匹配字符串,fnmatch/fnmatchcase