glob排除模式

Ana*_*dis 73 python glob

我有一个目录,里面有一堆文件:eee2314,asd3442...和eph.

我想要排除所有eph以该glob函数开头的文件.

我该怎么做?

Ken*_*nly 106

glob的模式规则不是正则表达式.相反,它们遵循标准的Unix路径扩展规则.只有几个特殊字符:两个不同的通配符,并且[来自glob ] 支持字符范围.

所以你可以用模式排除一些文件.
例如_,要使用glob 排除清单文件(以文件开头),您可以使用:

files = glob.glob('files_path/[!_]*')
Run Code Online (Sandbox Code Playgroud)

  • 这必须是官方文档,请有人将此添加到https://docs.python.org/3.5/library/glob.html#glob.glob (4认同)
  • 注意,全局模式不能直接满足OP提出的要求:仅排除以`eph`开头但可以以任何其他开头的文件。`[!e] [!p] [!h]`将过滤掉以`eee`开头的文件。 (2认同)
  • @VitalyZdanevich 它位于 fnmatch 的文档中:https://docs.python.org/3/library/fnmatch.html#module-fnmatch (2认同)

Mar*_*ers 42

您不能使用该glob函数排除模式,globs仅允许包含模式.全局语法非常有限(即使一个[!..]字符类必须与一个字符匹配,因此它是一个不在该类中的每个字符的包含模式).

你必须自己进行过滤; 列表理解通常在这里很好用:

files = [fn for fn in glob('somepath/*.txt') 
         if not os.path.basename(fn).startswith('eph')]
Run Code Online (Sandbox Code Playgroud)

  • 在此处使用“iglob”以避免将完整列表存储在内存中 (3认同)
  • @Hardex:在内部,`iglob`会*生成列表*。您要做的只是懒惰地评估过滤器。这无助于减少内存占用。 (2认同)

neu*_*nus 40

您可以扣除套数:

set(glob("*")) - set(glob("eph*"))
Run Code Online (Sandbox Code Playgroud)

  • 真的很有趣的解决方案!但是我的案子要读两次会非常慢。同样,如果文件夹的内容在网络目录上很大,又会变慢。但是无论如何,真的很方便。 (2认同)
  • 正如旁注所示,glob返回列表而不是集合,但这种操作仅适用于集合,因此为什么[neutrinus](/sf/users/85125211/)投射它.如果你需要它来保持列表,只需将整个操作包装在一个强制转换中:`list(set(glob("*")) - set(glob("eph")))` (2认同)

K R*_*ael 9

游戏迟到,但您也可以将 python 应用于 afilter的结果glob

files = glob.iglob('your_path_here')
files_i_care_about = filter(lambda x: not x.startswith("eph"), files)
Run Code Online (Sandbox Code Playgroud)

或用适当的正则表达式搜索等替换 lambda...

编辑:我刚刚意识到,如果您使用完整路径startswith将无法工作,因此您需要一个正则表达式

In [10]: a
Out[10]: ['/some/path/foo', 'some/path/bar', 'some/path/eph_thing']

In [11]: filter(lambda x: not re.search('/eph', x), a)
Out[11]: ['/some/path/foo', 'some/path/bar']
Run Code Online (Sandbox Code Playgroud)


小智 8

相比之下glob,我推荐pathlib。过滤一种模式非常简单。

from pathlib import Path

p = Path(YOUR_PATH)
filtered = [x for x in p.glob("**/*") if not x.name.startswith("eph")]
Run Code Online (Sandbox Code Playgroud)

如果你想过滤一个更复杂的模式,你可以定义一个函数来做到这一点,就像:

def not_in_pattern(x):
    return (not x.name.startswith("eph")) and not x.name.startswith("epi")


filtered = [x for x in p.glob("**/*") if not_in_pattern(x)]
Run Code Online (Sandbox Code Playgroud)

使用该代码,您可以过滤所有ephepi.


Azh*_*ari 6

在遍历文件夹中的所有文件时跳过特定文件怎么样!下面的代码将跳过所有以“eph”开头的excel文件

import glob
import re
for file in glob.glob('*.xlsx'):
    if re.match('eph.*\.xlsx',file):
        continue
    else:
        #do your stuff here
        print(file)
Run Code Online (Sandbox Code Playgroud)

通过这种方式,您可以使用更复杂的正则表达式模式来包含/排除文件夹中的特定文件集。