Próbuję uzyskać listę plików w katalogu przy użyciu Pythona, ale nie chcę listy WSZYSTKICH plików.
Zasadniczo chcę, aby móc zrobić coś takiego, ale używając Pythona i nie wykonując ls.
ls 145592*.jpg
Jeśli nie ma wbudowanej metody, obecnie myślę o napisaniu pętli for w celu iteracji wyników os.listdir()
i dołączenia wszystkich pasujących plików do nowej listy.
Jednak w tym katalogu znajduje się wiele plików i dlatego mam nadzieję, że istnieje bardziej wydajna metoda (lub metoda wbudowana).
Odpowiedzi:
glob.glob('145592*.jpg')
źródło
glob.glob('145592*.jpg')
drukuje całą bezwzględną ścieżkę plików, als 145592*.jpg
drukuje tylko listę plików.glob()
po prostu używa listdir + fnmatch, a nie specjalnych wywołań systemu operacyjnego do filtrowania symboli wieloznacznych. Na przykład w systemie WindowsFindFirstFile
interfejs API umożliwia określenie symboli wieloznacznych, dzięki czemu system operacyjny wykonuje filtrowanie bezpośrednio i prawdopodobnie bardziej wydajnie (nie sądzę, że istnieje odpowiednik w systemie Linux).glob.glob()
jest zdecydowanie sposobem na zrobienie tego (zgodnie z Ignacio). Jeśli jednak potrzebujesz bardziej skomplikowanego dopasowywania, możesz to zrobić ze zrozumieniem listy ire.match()
:Bardziej elastyczny, ale jak zauważasz, mniej wydajny.
źródło
[0-9]+
[0123456789]
sekwencje ( patrz dokumentacja ), a także mafnmatch.filter()
funkcję, która sprawia, że ta pętla jest nieco bardziej wydajna.Nie komplikuj:
Wolę tę formę listowego rozumienia, ponieważ dobrze czyta po angielsku.
Czytam czwarty wiersz w następujący sposób: Dla każdego pliku fn w os.listdir mojej ścieżki podaj mi tylko te, które pasują do któregokolwiek z moich dołączonych rozszerzeń.
Początkującym programistom pythonowym może być naprawdę trudno przyzwyczaić się do korzystania ze zrozumiałych list do filtrowania, a także może mieć narzut pamięci w przypadku bardzo dużych zestawów danych, ale w przypadku wyświetlania katalogu i innych prostych zadań filtrowania ciągów, zrozumienie listy prowadzi do większej czystości dokumentowalny kod.
Jedyną rzeczą w tym projekcie jest to, że nie chroni on przed błędem przekazania ciągu zamiast listy. Na przykład, jeśli przypadkowo przekonwertujesz ciąg znaków na listę i skończysz sprawdzanie wszystkich znaków łańcucha, możesz skończyć z mnóstwem fałszywych trafień.
Ale lepiej jest mieć problem, który można łatwo naprawić, niż rozwiązanie trudne do zrozumienia.
źródło
any()
, ponieważstr.endswith()
wymaga sekwencji zakończeń.if fn.endswith(included_extentensions)
jest więcej niż wystarczające.str.endswith(seq)
tego wskazanego Martijna, nie jest to poprawne, ponieważ plik musi się kończyć.ext
, aby miał to rozszerzenie. Ten kod znajdzie również (na przykład) plik o nazwie „myjpg” lub katalog o nazwie „png”. Aby to naprawić, wystarczy poprzedzić każde rozszerzenie wincluded_extensions
z.
.included_extensions
vsincluded_extentsions
? Szkoda, bo inaczej to moja preferowana odpowiedź.Inna opcja:
https://docs.python.org/3/library/fnmatch.html
źródło
glob
działa na jednej linii.glob
zwrócenie pełnej ścieżki, a nieos.listdir
tylko zwrócenie nazwy pliku. Przynajmniej tak dzieje się w Pythonie 2.Filtruj za pomocą
glob
modułu:Importuj glob
Dzikie karty:
Rozszerzenie Fiter
.txt
:Pojedyncza postać
Zakresy liczbowe
Zakresy alfabetyczne
źródło
Kod wstępny
Rozwiązanie 1 - użyj „glob”
Rozwiązanie 2 - użyj „os” + „fnmatch”
Wariant 2.1 - Wyszukiwanie w bieżącym reż
Wariant 2.2 - Wyszukiwanie rekurencyjne
Wynik
Rozwiązanie 3 - użyj „pathlib”
Uwagi:
źródło
użyj os.walk do rekurencyjnej listy plików
źródło
file.endswith(alist_filter)
wystarczy.To da ci listę plików jpg z pełną ścieżką. Można zastąpić
x[0]+"/"+f
zf
do tylko nazwy plików. Możesz również zastąpićf.endswith(".jpg")
dowolnym wymaganym ciągiem.źródło
może ci się spodobać podejście na wyższym poziomie (zaimplementowałem i spakowałem jako findtools ):
można zainstalować za pomocą
źródło
Nazwy plików z rozszerzeniami „jpg” i „png” w „path / to / images”:
źródło
Możesz użyć pathlib, który jest dostępny w standardowej bibliotece Pythona 3.4 i nowszych.
źródło
Możesz zdefiniować wzór i sprawdzić go. Tutaj wziąłem wzór początkowy i końcowy i szukam ich w nazwie pliku. PLIKI zawiera listę wszystkich plików w katalogu.
źródło
Co powiesz na str.split ()? Nic do zaimportowania.
źródło
f.endswith('.jpg')
(ale również wybierzefilename.jpg.ext
)Możesz użyć subprocess.check_ouput () jako
Oczywiście ciąg między cudzysłowami może być wszystkim, co chcesz wykonać w powłoce i przechowywać dane wyjściowe.
źródło
ls
wynik nie powinien być analizowany .