有没有更好的方法来使用glob。Glob在python中获取多个文件类型的列表,如.txt, .mdown和.markdown?现在我有这样的东西:

projectFiles1 = glob.glob( os.path.join(projectDir, '*.txt') )
projectFiles2 = glob.glob( os.path.join(projectDir, '*.mdown') )
projectFiles3 = glob.glob( os.path.join(projectDir, '*.markdown') )

当前回答

Glob返回一个列表:为什么不只是多次运行它并连接结果呢?

from glob import glob
project_files = glob('*.txt') + glob('*.mdown') + glob('*.markdown')

其他回答

一个glob,许多扩展…但不完美的解决方案(可能匹配其他文件)。

filetypes = ['tif', 'jpg']

filetypes = zip(*[list(ft) for ft in filetypes])
filetypes = ["".join(ch) for ch in filetypes]
filetypes = ["[%s]" % ch for ch in filetypes]
filetypes = "".join(filetypes) + "*"
print(filetypes)
# => [tj][ip][fg]*

glob.glob("/path/to/*.%s" % filetypes)

Python 3

我们可以使用pathlib;.glob仍然不支持对多个参数或在大括号内(如POSIX shell)进行通配符操作,但我们可以轻松地过滤结果。

例如,理想情况下你可能喜欢做的事情:

# NOT VALID
Path(config_dir).glob("*.{ini,toml}")
# NOR IS
Path(config_dir).glob("*.ini", "*.toml")

你可以:

filter(lambda p: p.suffix in {".ini", ".toml"}, Path(config_dir).glob("*"))

这也不算太糟。

也许有更好的办法,但是:

import glob
types = ('*.pdf', '*.cpp') # the tuple of file types
files_grabbed = []
for files in types:
    files_grabbed.extend(glob.glob(files))

# files_grabbed is the list of pdf and cpp files

也许还有其他的方法,所以等待别人提出更好的答案。

对于glob,这是不可能的。你只能使用: *匹配所有内容 ? 匹配任何单个字符 [seq]匹配seq中的任意字符 [!Seq]匹配任何不在Seq中的字符

使用操作系统。Listdir和regexp检查模式:

for x in os.listdir('.'):
  if re.match('.*\.txt|.*\.sql', x):
    print x

这是一个Python 3.4+ pathlib解决方案:

exts = ".pdf", ".doc", ".xls", ".csv", ".ppt"
filelist = (str(i) for i in map(pathlib.Path, os.listdir(src)) if i.suffix.lower() in exts and not i.stem.startswith("~"))

此外,它会忽略所有以~开头的文件名。