Python glob mehrere Dateitypen

Lesezeit: 3 Minuten

Gibt es eine bessere Möglichkeit, glob.glob in Python zu verwenden, um eine Liste mehrerer Dateitypen wie .txt, .mdown und .markdown zu erhalten? Momentan habe ich so etwas:

projectFiles1 = glob.glob( os.path.join(projectDir, '*.txt') )
projectFiles2 = glob.glob( os.path.join(projectDir, '*.mdown') )
projectFiles3 = glob.glob( os.path.join(projectDir, '*.markdown') )

  • Sehr verwandt: stackoverflow.com/q/48181073/880783

    – Bers

    28. März 18 um 7:16 Uhr

  • Warum nicht main_file = projectFiles1 + projectFiles2 + projectFiles3 ? was auch zu einer Hauptliste mit allen Typen durch Verkettung führt

    – Delrius-Euphorie

    4. September 2020 um 15:29 Uhr

  • Habe noch nie eine Datei *.mdown gesehen ..;)

    –Timo

    25. Dezember 2020 um 15:53 ​​Uhr


Python glob mehrere Dateitypen
Patrick Mooney

glob gibt eine Liste zurück: Warum führen Sie sie nicht einfach mehrmals aus und verketten die Ergebnisse?

from glob import glob
project_files = glob('*.txt') + glob('*.mdown') + glob('*.markdown')

  • Dies ist möglicherweise die am besten lesbare Lösung. Ich würde den Fall ändern ProjectFiles zu projectFilesaber tolle Lösung.

    – Hans Goldmann

    2. Juni 17 um 22:38 Uhr

  • Beachten Sie, dass in Python 3x Path.glob('*') gibt einen Generator zurück, also müssen Sie a setzen list(...) herum, um diesen Trick anzuwenden.

    – Mark Maxmeister

    9. August 21 um 20:18 Uhr

Python glob mehrere Dateitypen
tzot

Verketten Sie die Ergebnisse:

import itertools as it, glob

def multiple_file_types(*patterns):
    return it.chain.from_iterable(glob.iglob(pattern) for pattern in patterns)

Dann:

for filename in multiple_file_types("*.txt", "*.sql", "*.log"):
    # do stuff

  • glob.glob -> glob.iglob, damit die Iteratorenkette vollständig faul ausgewertet wird

    – rodrigob

    6. August 13 um 13:57 Uhr

  • Ich habe die gleiche Lösung gefunden, kannte sie aber nicht chain.from_iterable. Das ist also ähnlich, aber weniger lesbar: it.chain(*(glob.iglob(pattern) for pattern in patterns)).

    – Florisla

    20. April 18 um 11:35 Uhr

Python glob mehrere Dateitypen
Gier

So viele Antworten, die nahelegen, so oft wie die Anzahl der Erweiterungen zu globben, ich würde es vorziehen, stattdessen nur einmal zu globben:

from pathlib import Path

files = (p.resolve() for p in Path(path).glob("**/*") if p.suffix in {".c", ".cc", ".cpp", ".hxx", ".h"})

  • glob.glob -> glob.iglob, damit die Iteratorenkette vollständig faul ausgewertet wird

    – rodrigob

    6. August 13 um 13:57 Uhr

  • Ich habe die gleiche Lösung gefunden, kannte sie aber nicht chain.from_iterable. Das ist also ähnlich, aber weniger lesbar: it.chain(*(glob.iglob(pattern) for pattern in patterns)).

    – Florisla

    20. April 18 um 11:35 Uhr

Zum Beispiel für *.mp3 und *.flac Bei mehreren Ordnern können Sie Folgendes tun:

mask = r'music/*/*.[mf][pl][3a]*'
glob.glob(mask)

Die Idee kann auf weitere Dateierweiterungen erweitert werden, aber Sie müssen sicherstellen, dass die Kombinationen nicht mit anderen unerwünschten Dateierweiterungen übereinstimmen, die Sie möglicherweise in diesen Ordnern haben. So, vorsichtig sein mit diesem.

Um eine beliebige Liste von Erweiterungen automatisch zu einem einzigen Glob-Muster zu kombinieren, können Sie Folgendes tun:

def multi_extension_glob_mask(mask_base, *extensions):
    mask_ext = ['[{}]'.format(''.join(set(c))) for c in zip(*extensions)]
    if not mask_ext or len(set(len(e) for e in extensions)) > 1:
        mask_ext.append('*')
    return mask_base + ''.join(mask_ext)

mask = multi_extension_glob_mask('music/*/*.', 'mp3', 'flac', 'wma')
print(mask)  # music/*/*.[mfw][pml][a3]*

.

758250cookie-checkPython glob mehrere Dateitypen

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy