Een gefilterde lijst met bestanden in een map ophalen

Ik probeer een lijst met bestanden in een map te krijgen met Python, maar ik wil geen lijst met ALLE bestanden.

Wat ik in wezen wil, is de mogelijkheid om iets als het volgende te doen, maar met Python en niet om ls uit te voeren.

ls 145592*.jpg

Als hier geen ingebouwde methode voor is, denk ik er momenteel aan om een ​​for-lus te schrijven om de resultaten van een os.listdir()te doorlopen en alle overeenkomende bestanden toe te voegen aan een nieuwe lijst.

Er staan ​​echter veel bestanden in die map en daarom hoop ik dat er een efficiëntere methode is (of een ingebouwde methode).


Antwoord 1, autoriteit 100%

import glob
jpgFilenamesList = glob.glob('145592*.jpg')

Zie globin python-documentatie


Antwoord 2, autoriteit 31%

glob.glob()is zeker de manier om het te doen (volgens Ignacio). Als u echter meer gecompliceerde matching nodig heeft, kunt u dit doen met een lijstbegrip en re.match(), zoiets als:

files = [f for f in os.listdir('.') if re.match(r'[0-9]+.*\.jpg', f)]

Flexibeler, maar zoals u opmerkt, minder efficiënt.


Antwoord 3, autoriteit 15%

Houd het simpel:

import os
relevant_path = "[path to folder]"
included_extensions = ['jpg','jpeg', 'bmp', 'png', 'gif']
file_names = [fn for fn in os.listdir(relevant_path)
              if any(fn.endswith(ext) for ext in included_extensions)]

Ik geef de voorkeur aan deze vorm van lijstbegrip omdat het goed leesbaar is in het Engels.

Ik lees de vierde regel als:
Geef me voor elke fn in os.listdir voor mijn pad alleen de fns die overeenkomen met een van mijn opgenomen extensies.

Het kan moeilijk zijn voor beginnende python-programmeurs om echt te wennen aan het gebruik van lijstbegrippen voor filteren, en het kan wat geheugenoverhead hebben voor zeer grote datasets, maar voor het weergeven van een directory en andere eenvoudige stringfiltertaken, leidt lijstbegrippen naar meer schone, documenteerbare code.

Het enige aan dit ontwerp is dat het je niet beschermt tegen het maken van de fout om een ​​string door te geven in plaats van een lijst. Als u bijvoorbeeld per ongeluk een tekenreeks naar een lijst converteert en uiteindelijk alle tekens van een tekenreeks controleert, kunt u een hele reeks valse positieven krijgen.

Maar het is beter om een ​​probleem te hebben dat gemakkelijk op te lossen is dan een oplossing die moeilijk te begrijpen is.


Antwoord 4, autoriteit 10%

Een andere optie:

>>> import os, fnmatch
>>> fnmatch.filter(os.listdir('.'), '*.py')
['manage.py']

https://docs.python.org/3/library/fnmatch.html


Antwoord 5

Bestandsnamen met de extensies “jpg” en “png” in “path/to/images”:

import os
accepted_extensions = ["jpg", "png"]
filenames = [fn for fn in os.listdir("path/to/images") if fn.split(".")[-1] in accepted_extensions]

Antwoord 6

U kunt een patroon definiëren en controleren. Hier heb ik zowel het begin- als het eindpatroon genomen en ernaar gezocht in de bestandsnaam. FILES bevat de lijst van alle bestanden in een map.

import os
PATTERN_START = "145592"
PATTERN_END = ".jpg"
CURRENT_DIR = os.path.dirname(os.path.realpath(__file__))
for r,d,FILES in os.walk(CURRENT_DIR):
    for FILE in FILES:
        if PATTERN_START in FILE.startwith(PATTERN_START) and PATTERN_END in FILE.endswith(PATTERN_END):
            print FILE

Antwoord 7

U kunt subprocess.check_ouput() gebruiken als

import subprocess
list_files = subprocess.check_output("ls 145992*.jpg", shell=True) 

Natuurlijk kan de tekenreeks tussen aanhalingstekens alles zijn wat u in de shell wilt uitvoeren en de uitvoer wilt opslaan.

Other episodes