Czy istnieje lepszy sposób na użycie glob.glob w Pythonie, aby uzyskać listę wielu typów plików, takich jak .txt, .mdown i .markdown? W tej chwili mam coś takiego:
projectFiles1 = glob.glob( os.path.join(projectDir, '*.txt') )
projectFiles2 = glob.glob( os.path.join(projectDir, '*.mdown') )
projectFiles3 = glob.glob( os.path.join(projectDir, '*.markdown') )
Odpowiedzi:
Może jest lepszy sposób, ale co powiesz na:
Być może jest inny sposób, więc poczekaj, aż ktoś inny poda lepszą odpowiedź.
źródło
files_grabbed = [glob.glob(e) for e in ['*.pdf', '*.cpp']]
[f for f_ in [glob.glob(e) for e in ('*.jpg', '*.mp4')] for f in f_]
Jeśli musisz określić ścieżkę, zapętlaj wzorce dopasowania i zachowaj połączenie wewnątrz pętli dla uproszczenia:
źródło
glob
zwraca listę: dlaczego po prostu nie uruchomić jej wiele razy i nie połączyć wyników?źródło
ProjectFiles
naprojectFiles
, ale świetne rozwiązanie.Połącz wyniki:
Następnie:
źródło
chain.from_iterable
. Więc to jest podobne, ale mniej czytelny:it.chain(*(glob.iglob(pattern) for pattern in patterns))
.Tak wiele odpowiedzi, które sugerują globowanie tyle razy, ile liczba rozszerzeń, wolałbym globbować tylko raz:
źródło
w przypadku globu nie jest to możliwe. możesz użyć tylko:
* pasuje do wszystkiego
? dopasowuje dowolny pojedynczy znak
[seq] odpowiada dowolnemu znakowi w seq
[! seq] dopasowuje dowolny znak spoza seq
użyj os.listdir i wyrażenia regularnego, aby sprawdzić wzorce:
źródło
itertools
Ponieważ kolejne zmiany wzorców również muszą być hacky (powiedzmy, że chcesz zezwolić na duże i małe litery) . Aha, i pisanie mogłoby być czystsze'.*\.(txt|sql)'
Na przykład dla
*.mp3
i*.flac
na wielu folderach możesz wykonać:Pomysł można rozszerzyć na więcej rozszerzeń plików, ale musisz sprawdzić, czy kombinacje nie będą pasować do żadnego innego niechcianego rozszerzenia plików, które możesz mieć w tych folderach. Więc uważaj z tym.
Aby automatycznie połączyć dowolną listę rozszerzeń w jeden wzorzec glob, możesz wykonać następujące czynności:
źródło
Jedna linijka, po prostu dla diabła z tym ..
wynik:
źródło
Po przyjściu tutaj po pomoc stworzyłem własne rozwiązanie i chciałem się nim podzielić. Opiera się na odpowiedzi użytkownika2363986, ale myślę, że jest to bardziej skalowalne. Oznacza to, że jeśli masz 1000 rozszerzeń, kod nadal będzie wyglądał dość elegancko.
źródło
directoryPath = "/Users/bla/bla/images_dir*."
źródło
Chociaż domyślna glob w Pythonie nie podąża za globem Basha, możesz to zrobić z innymi bibliotekami. Możemy włączyć szelki w pliku glob wcmatch .
Możesz nawet użyć rozszerzonych wzorców glob, jeśli wolisz:
źródło
recursive
flagiglob.GLOBSTAR
flagęWydałem Formic, który implementuje wiele dołączeń w podobny sposób jak FileSet i Globs Apache Ant .
Wyszukiwanie można wdrożyć:
Ponieważ zaimplementowano pełną wersję Ant glob, możesz dołączyć różne katalogi do każdego wzorca, więc możesz wybrać tylko te pliki .txt w jednym podkatalogu, a .markdown w innym, na przykład:
Mam nadzieję, że to pomoże.
źródło
Poniższe funkcje
_glob
globalne dla wielu rozszerzeń plików.źródło
To jest
pathlib
rozwiązanie Python 3.4+ :Ignoruje również wszystkie nazwy plików zaczynające się od
~
.źródło
Oto jednowierszowy wariant odpowiedzi Pata ze zrozumieniem listy (który obejmuje również to, że chciałeś globować w określonym katalogu projektu):
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 :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.źródło
Nie
glob
, ale oto inny sposób używania rozumienia listy:źródło
Możesz spróbować stworzyć ręczną listę porównującą rozszerzenia istniejących z tymi, których potrzebujesz.
źródło
https://docs.python.org/3.5/library/functools.html#functools.reduce https://docs.python.org/3.5/library/operator.html#operator.add
źródło
Aby
glob
mieć wiele typów plików, musiszglob()
kilkakrotnie wywołać funkcję w pętli. Ponieważ ta funkcja zwraca listę, musisz połączyć listy.Na przykład ta funkcja wykonuje zadanie:
Proste użycie:
Możesz także użyć
glob.iglob()
iteratora:źródło
Użyj listy rozszerzeń i powtórz
źródło
Możesz użyć filtra:
źródło
Możesz również użyć w ten
reduce()
sposób:tworzy to listę
glob.glob()
dla każdego wzorca i redukuje je do jednej listy.źródło
Jedna glob, wiele rozszerzeń ... ale rozwiązanie niedoskonałe (może pasować do innych plików).
źródło
Miałem ten sam problem i to właśnie wymyśliłem
źródło
Jeszcze inne rozwiązanie (użyj,
glob
aby uzyskać ścieżki przy użyciu wielu dopasowańpatterns
i połączyć wszystkie ścieżki w jedną listę za pomocąreduce
iadd
):źródło
Jeśli używasz,
pathlib
spróbuj tego:źródło
Po wynikach testów empirycznych okazało się, że
glob.glob
nie jest to lepszy sposób na odfiltrowanie plików według ich rozszerzeń. Oto niektóre z powodów:Przetestowałem (pod kątem poprawności i wydajności w czasie) następujące
4
różne metody filtrowania plików według rozszerzeń i umieszczam je wlist
:Uruchamiając powyższy kod na moim laptopie uzyskałem następujące auto-wyjaśnienia.
Najszybszy sposób na odfiltrowanie plików według rozszerzeń jest nawet najbrzydszy. Czyli zagnieżdżone
for
pętle istring
porównanie przy użyciuendswith()
metody.Ponadto, jak widać, algorytmy globbingu (ze wzorcem
E:\x\y\z\**/*[py][pyc]
) nawet z2
podanym tylko rozszerzeniem (py
ipyc
) zwracają również niepoprawne wyniki.źródło
źródło
To powinno działać:
źródło
Na przykład:
Funkcja:
źródło