Jak mogę znaleźć wszystkie pliki w katalogu posiadającym rozszerzenie .txt
w Pythonie?
1043
Możesz użyć glob
:
import glob, os
os.chdir("/mydir")
for file in glob.glob("*.txt"):
print(file)
lub po prostu os.listdir
:
import os
for file in os.listdir("/mydir"):
if file.endswith(".txt"):
print(os.path.join("/mydir", file))
lub jeśli chcesz przejść przez katalog, użyj os.walk
:
import os
for root, dirs, files in os.walk("/mydir"):
for file in files:
if file.endswith(".txt"):
print(os.path.join(root, file))
for file in f
niż dla,for files in f
ponieważ w zmiennej znajduje się pojedyncza nazwa pliku. Jeszcze lepiej byłoby, aby zmienićf
sięfiles
, a następnie do pętli może staćfor file in files
.file
nie jest słowem zastrzeżonym, tylko nazwą predefiniowanej funkcji, więc całkiem możliwe jest użycie go jako nazwy zmiennej we własnym kodzie. Chociaż prawdą jest, że generalnie należy unikać takich kolizji,file
jest to szczególny przypadek, ponieważ prawie nigdy nie ma potrzeby korzystania z niego, dlatego często jest uważany za wyjątek od wytycznych. Jeśli nie chcesz tego robić, PEP8 zaleca dołączenie jednego podkreślenia do takich nazw, tzn. Tofile_
, co musisz zgodzić się, jest nadal dość czytelne.Użyj glob .
źródło
glob
nie można rekurencyjnie znaleźć plików, jeśli Twój python ma mniej niż 3.5 więcej informowaćCoś takiego powinno wystarczyć
źródło
root, dirs, files
zamiastr, d, f
. O wiele bardziej czytelny.Coś takiego będzie działać:
źródło
os.path.join
na każdym elemencietext_files
. To może być coś takiegotext_files = [os.path.join(path, f) for f in os.listdir(path) if f.endswith('.txt')]
.Możesz po prostu użyć
pathlib
s 1 :glob
lub w pętli:
Jeśli chcesz to rekurencyjne, możesz użyć
.glob('**/*.txt)
1
pathlib
moduł został w standardowym biblioteki w pytona 3.4. Ale możesz zainstalować tylne porty tego modułu nawet na starszych wersjach Pythona (tj. Używającconda
lubpip
):pathlib
ipathlib2
.źródło
**/*.txt
nie jest obsługiwany przez starsze wersje Pythona. Rozwiązałem to dzięki:foundfiles= subprocess.check_output("ls **/*.txt", shell=True)
for foundfile in foundfiles.splitlines():
print foundfile
pathlib
można zrobić, a ja już uwzględniłem wymagania dotyczące wersji Pythona. :) Ale jeśli twoje podejście nie zostało jeszcze opublikowane, dlaczego nie dodać go jako kolejnej odpowiedzi?rglob
jeśli chcesz szukać przedmiotów rekurencyjnie. Np..rglob('*.txt')
źródło
Lubię os.walk () :
Lub z generatorami:
źródło
Oto kolejne wersje tego samego, które dają nieco inne wyniki:
glob.iglob ()
glob.glob1 ()
fnmatch.filter ()
źródło
glob1()
jest funkcja pomocnicza wglob
module, która nie jest wymieniona w dokumentacji Pythona. Istnieje kilka wbudowanych komentarzy opisujących, co robi w pliku źródłowym, patrz.../Lib/glob.py
.glob.glob1()
nie jest publiczny, ale jest dostępny w Pythonie 2.4-2.7; 3.0-3.2; pypy; jython github.com/zed/test_glob1glob
modułu.path.py to kolejna alternatywa: https://github.com/jaraco/path.py
źródło
for f in p.walk(pattern='*.txt')
przejść przez wszystkie podfolderylist(p.glob('**/*.py'))
Python v3.5 +
Szybka metoda z użyciem os.scandir w funkcji rekurencyjnej. Wyszukuje wszystkie pliki z określonym rozszerzeniem w folderze i podfolderach.
Aktualizacja kwietnia 2019 r
Jeśli przeszukujesz katalogi zawierające pliki 10 000, dołączanie do listy staje się nieefektywne. „Uzyskanie” wyników jest lepszym rozwiązaniem. Dołączyłem również funkcję konwersji danych wyjściowych na ramkę danych Pandas.
źródło
Python ma wszystkie narzędzia, aby to zrobić:
źródło
all_txt_files = list(filter(lambda x: x.endswith('.txt'), os.listdir(the_dir)))
Aby wszystkie nazwy plików „.txt” znalazły się w folderze „dataPath” jako listę w języku Python:
źródło
Wypróbuj to, aby rekursywnie znaleźć wszystkie twoje pliki:
źródło
**
. Dostępne tylko w Pythonie 3. Nie podoba mi się tachdir
część. Nie ma takiej potrzeby.filepath = os.path.join('wallpaper')
a następnie użyć jej jakoglob.glob(filepath+"**/*.psd", recursive = True)
, co dałoby ten sam wynik.źródło
Zrobiłem test (Python 3.6.4, W7x64), aby sprawdzić, które rozwiązanie jest najszybsze dla jednego folderu, bez podkatalogów, aby uzyskać listę pełnych ścieżek plików dla plików o określonym rozszerzeniu.
W skrócie, dla tego zadania
os.listdir()
jest najszybszym i 1,7x szybciej niż następna najlepsza:os.walk()
(! Z przerwą), 2,7X jak najszybciejpathlib
, 3.2x szybszy niżos.scandir()
i 3.3x szybszy niżglob
.Pamiętaj, że wyniki te zmienią się, gdy będziesz potrzebować wyników rekurencyjnych. Jeśli skopiujesz / wkleisz jedną z poniższych metod, dodaj .lower (), w przeciwnym razie .EXT nie zostanie znaleziony podczas wyszukiwania .ext.
Wyniki:
źródło
Ten kod upraszcza moje życie.
źródło
Użyj fnmatch: https://docs.python.org/2/library/fnmatch.html
źródło
Aby uzyskać tablicę nazw plików „.txt” z folderu o nazwie „dane” w tym samym katalogu, zwykle używam tego prostego wiersza kodu:
źródło
Sugeruję użycie fnmatch i górnej metody. W ten sposób możesz znaleźć jedno z poniższych:
.
źródło
Oto jeden z
extend()
źródło
.txt
:)Funkcjonalne rozwiązanie z podkatalogami:
źródło
Jeśli folder zawiera wiele plików lub pamięć jest ograniczeniem, rozważ użycie generatorów:
Opcja A: Iteracja
Opcja B: zdobądź wszystko
źródło
Możliwe do skopiowania rozwiązanie podobne do ghostdog:
źródło
użyj modułu Python OS , aby znaleźć pliki z określonym rozszerzeniem.
prosty przykład jest tutaj:
źródło
Wielu użytkowników odpowiedziało
os.walk
odpowiedziami, które obejmują wszystkie pliki, ale także wszystkie katalogi i podkatalogi oraz ich pliki.Lub dla jednego, w którym nie potrzebujesz generatora:
Jeśli zamierzasz używać dopasowań do czegoś innego, możesz chcieć, aby była to lista zamiast wyrażenia generatora:
źródło
Prosta metoda za pomocą
for
pętli:Chociaż można to bardziej uogólnić.
źródło