Chcę otworzyć serię podfolderów w folderze i znaleźć kilka plików tekstowych oraz wydrukować kilka wierszy plików tekstowych. Używam tego:
configfiles = glob.glob('C:/Users/sam/Desktop/file1/*.txt')
Ale to nie może również uzyskać dostępu do podfolderów. Czy ktoś wie, jak mogę użyć tego samego polecenia, aby uzyskać dostęp również do podfolderów?
python
filesystems
glob
fnmatch
UżytkownikRRR
źródło
źródło
Odpowiedzi:
W Pythonie 3.5 i nowszych użyj nowej
**/
funkcji rekurencyjnej :Kiedy
recursive
jest ustawiona,**
następuje separator ścieżki dopasowujący 0 lub więcej podkatalogów.We wcześniejszych wersjach Pythona
glob.glob()
nie można rekurencyjnie wyświetlać plików w podkatalogach.W takim przypadku użyłbym zamiast tego w
os.walk()
połączeniu zfnmatch.filter()
:Spowoduje to rekurencyjne przejrzenie katalogów i zwrócenie wszystkich bezwzględnych ścieżek do pasujących
.txt
plików. W tym konkretnym przypadkufnmatch.filter()
może to być przesada, możesz również użyć.endswith()
testu:źródło
path to directory
.recursive=False
razem z**/
funkcjonalnością nie dostarcza listy plików tylko w danym folderze, a raczej w jego elementach podrzędnych?**/
podaje listę nazw katalogów w bieżącym katalogu roboczym, ponieważ wzorzec kończy się na/
, a zrecursive=False
tobą w zasadzie masz podwójne*
, pasujące tak samo jak*/
, tylko mniej wydajne.*/*
jeśli potrzebujesz wszystkich plików we wszystkich podkatalogach.Aby znaleźć pliki w bezpośrednich podkatalogach:
W przypadku wersji rekurencyjnej, która przechodzi przez wszystkie podkatalogi, można użyć
**
i przekazaćrecursive=True
od Pythona 3.5 :Listy zwrotów obu wywołań funkcji. Możesz użyć
glob.iglob()
do zwrócenia ścieżek jedna po drugiej. Lub użyjpathlib
:Obie metody zwracają iteratory (ścieżki można pobierać pojedynczo).
źródło
glob()
się również obsługi wzorców w katalogach.**
przypadku rekursji. Ale dla**
do pracy, mają ustawićrecursion=True
przełącznik, btw.W tym temacie jest wiele nieporozumień. Zobaczmy, czy mogę to wyjaśnić (Python 3.7):
glob.glob('*.txt') :
dopasowuje wszystkie pliki kończące się na „.txt” w bieżącym kataloguglob.glob('*/*.txt') :
tak samo jak 1glob.glob('**/*.txt') :
dopasowuje wszystkie pliki kończące się na „.txt” tylko w bezpośrednich podkatalogach , ale nie w bieżącym kataloguglob.glob('*.txt',recursive=True) :
tak samo jak 1glob.glob('*/*.txt',recursive=True) :
tak samo jak 3glob.glob('**/*.txt',recursive=True):
dopasowuje wszystkie pliki kończące się na „.txt” w bieżącym katalogu i we wszystkich podkatalogachDlatego najlepiej zawsze określać
recursive=True.
źródło
Glob2 Pakiet obsługuje dzikie karty i jest dość szybki
Na moim laptopie dopasowanie > 60 000 ścieżek plików zajmuje około 2 sekund .
źródło
Możesz używać Formic z Pythonem 2.6
Ujawnienie - jestem autorem tego pakietu.
źródło
Oto dostosowana wersja, która umożliwia
glob.glob
podobną funkcjonalność bez użyciaglob2
.Więc jeśli masz następującą strukturę dir
Możesz zrobić coś takiego
Prawie
fnmatch
dopasowanie wzorca na całej nazwie pliku, a nie tylko na nazwie pliku.źródło
configfiles = glob.glob('C:/Users/sam/Desktop/**/*.txt")
Nie działa we wszystkich przypadkach, zamiast tego użyj glob2
źródło
Jeśli możesz zainstalować pakiet glob2 ...
Wszystkie nazwy plików i foldery:
źródło
Jeśli używasz Pythona 3.4+, możesz użyć
pathlib
modułu.Path.glob()
Metoda obsługuje**
wzorzec, co oznacza „tego katalogu i wszystkich podkatalogów rekurencyjnie”. Zwraca generator generującyPath
obiekty dla wszystkich pasujących plików.źródło
Jak zauważył Martijn, glob może to zrobić tylko za pośrednictwem
**
operatora wprowadzonego w Pythonie 3.5. Ponieważ program operacyjny wyraźnie poprosił o moduł glob, poniższy komunikat zwróci leniwy iterator oceny, który zachowuje się podobnieZauważ, że możesz powtórzyć
configfiles
to podejście tylko raz . Jeśli potrzebujesz prawdziwej listy plików konfiguracyjnych, których można użyć w wielu operacjach, musisz utworzyć ją jawnie za pomocąlist(configfiles)
.źródło
Polecenie
rglob
wykona nieskończoną rekursję na najgłębszym poziomie struktury katalogów. Jeśli chcesz mieć tylko jeden poziom głębokości, nie używaj go.Zdaję sobie sprawę, że OP mówił o używaniu glob.glob. Uważam jednak, że to odpowiada intencji, która polega na rekurencyjnym przeszukiwaniu wszystkich podfolderów.
rglob
Funkcja wyprodukowała 100x wzrost prędkości dla algorytmu obróbki danych, który został z wykorzystaniem struktury katalogów jako stała założeniu na celu odczytu danych. Jednak dzięki temu,rglob
że byliśmy w stanie raz wykonać jedno skanowanie wszystkich plików w określonym katalogu nadrzędnym lub poniżej, zapisać ich nazwy na liście (ponad milion plików), a następnie użyć tej listy, aby określić, które pliki musimy otworzyć w dowolnym w przyszłości w oparciu o konwencje nazewnictwa plików w porównaniu z tym, w którym folderze się znajdują.źródło