Oto jednowierszowy wariant odpowiedzi Pata ze zrozumieniem listy (który obejmuje również to, że chciałeś globować w określonym katalogu projektu):
import os, glob
exts = ['*.txt', '*.mdown', '*.markdown']
files = [f for ext in exts for f in glob.glob(os.path.join(project_dir, ext))]
Zapętlasz rozszerzenia ( for ext in exts
), a następnie dla każdego rozszerzenia pobierasz każdy plik pasujący do wzorca glob ( for f in glob.glob(os.path.join(project_dir, ext)
).
To rozwiązanie jest krótkie i nie zawiera żadnych niepotrzebnych pętli for, zagnieżdżonych list składanych ani funkcji zaśmiecających kod. Po prostu czysty, wyrazisty, pytoniczny Zen .
To rozwiązanie pozwala mieć niestandardową listę, exts
które można zmienić bez konieczności aktualizowania kodu. (To zawsze dobra praktyka!)
Zrozumienie listy jest takie samo, jak w rozwiązaniu Laurenta (na które głosowałem). Ale argumentowałbym, że zwykle nie jest konieczne wyodrębnianie pojedynczego wiersza do oddzielnej funkcji, dlatego zapewniam to jako alternatywne rozwiązanie.
Premia:
Jeśli chcesz przeszukać nie tylko pojedynczy katalog, ale także wszystkie podkatalogi, możesz przekazać recursive=True
i użyć symbolu globu wielu katalogów **
1 :
files = [f for ext in exts
for f in glob.glob(os.path.join(project_dir, '**', ext), recursive=True)]
Spowoduje to wywołanie glob.glob('<project_dir>/**/*.txt', recursive=True)
i tak dalej dla każdego rozszerzenia.
1 Technicznie rzecz biorąc, **
symbol globu po prostu dopasowuje jeden lub więcej znaków, w tym ukośnik /
(w przeciwieństwie do pojedynczego *
symbolu globu). W praktyce musisz tylko pamiętać, że tak długo, jak **
otaczasz ukośnikami (separatorami ścieżek), dopasowuje zero lub więcej katalogów.