webentwicklung-frage-antwort-db.com.de

Glob schließen Muster aus

Ich habe ein Verzeichnis mit einer Reihe von Dateien: eee2314, asd3442 ... und eph.

Ich möchte alle Dateien, die mit eph beginnen, mit der Funktion glob ausschließen.

Wie kann ich es tun?

64

Die Musterregeln für glob sind keine regulären Ausdrücke. Stattdessen folgen sie den standardmäßigen Unix-Pfaderweiterungsregeln. Es gibt nur wenige Sonderzeichen: Es werden zwei verschiedene Platzhalter und Zeichenbereiche unterstützt [from glob ].

So können Sie einige Dateien mit Mustern ausschließen.
Um beispielsweise Manifestdateien (Dateien, die mit _ Beginnen) mit glob auszuschließen, können Sie Folgendes verwenden:

files = glob.glob('files_path/[!_]*')
91
zety

Sie können Muster mit der Funktion glob nicht ausschließen, Globs lassen nur Einschlussmuster zu. Globbing-Syntax ist sehr begrenzt (sogar ein [!..] Zeichenklasse muss mit einem Zeichen übereinstimmen, daher handelt es sich um ein Einschlussmuster für jedes Zeichen, das nicht in der Klasse ist).

Sie müssen selbst filtern. Ein Listenverständnis funktioniert hier normalerweise gut:

files = [fn for fn in glob('somepath/*.txt') 
         if not os.path.basename(fn).startswith('eph')]
41
Martijn Pieters

Sie können Sätze abziehen:

set(glob("*")) - set(glob("eph*"))
34
neutrinus

Spät zum Spiel, aber Sie können alternativ auch ein python filter auf das Ergebnis eines glob anwenden:

files = glob.iglob('your_path_here')
files_i_care_about = filter(lambda x: not x.startswith("eph"), files)

oder Ersetzen des Lambda durch eine entsprechende Regex-Suche, etc ...

BEARBEITEN: Ich habe gerade festgestellt, dass wenn Sie vollständige Pfade verwenden, das startswith nicht funktioniert, Sie also einen regulären Ausdruck benötigen würden

In [10]: a
Out[10]: ['/some/path/foo', 'some/path/bar', 'some/path/eph_thing']

In [11]: filter(lambda x: not re.search('/eph', x), a)
Out[11]: ['/some/path/foo', 'some/path/bar']
4
K Raphael

Um Dateien auszuschließen, die nicht mit einigen regulären Shell-Ausdrücken kompatibel sind, können Sie das Modul fnmatch verwenden:

import fnmatch

file_list = glob('somepath')    
for ind, ii in enumerate(file_list):
    if not fnmatch.fnmatch(ii, 'bash_regexp_with_exclude'):
        file_list.pop(ind)

Der obige Befehl generiert zunächst eine Liste aus einem bestimmten Pfad und gibt anschließend die Dateien aus, die den regulären Ausdruck mit der gewünschten Einschränkung nicht erfüllen.

2

Wie wäre es, wenn Sie eine bestimmte Datei überspringen und dabei alle Dateien im Ordner durchlaufen würden? Der folgende Code überspringt alle Excel-Dateien, die mit "eph" beginnen.

import glob
import re
for file in glob.glob('*.xlsx'):
    if re.match('eph.*\.xlsx',file):
        continue
    else:
        #do your stuff here
        print(file)

Auf diese Weise können Sie komplexere Regex-Muster verwenden, um einen bestimmten Satz von Dateien in einem Ordner ein- oder auszuschließen.

2
Azhar Ansari

Vergleichen Sie mit glob, ich empfehle pathlib, filtern Sie ein Muster ist sehr einfach.

from pathlib import Path
p = Path(YOUR_PATH)
filtered = [x for x in p.glob('**/*') if not x.name.startswith('eph'))]

und wenn Sie komplexere Muster filtern möchten, können Sie eine Funktion dafür definieren, wie zum Beispiel:

def not_in_pattern(x):
    return (not x.name.startswith('eph')) and 
            not x.name.startswith('epi')'))

filtered = [x for x in p.glob('**/*') if not_in_pattern(x)]

mit diesem Code können Sie alle Dateien filtern, die mit eph oder mit epi beginnen.

2
Scott Ming

Wie in der akzeptierten Antwort erwähnt, können Sie Muster mit glob nicht ausschließen. Im Folgenden finden Sie eine Methode zum Filtern Ihres glob-Ergebnisses.

Die akzeptierte Antwort ist wahrscheinlich die beste pythonische Methode, aber wenn Sie denken, dass Listenverständnisse ein bisschen hässlich aussehen und Ihren Code sowieso maximal numpythonisch machen möchten (wie ich), können Sie dies tun (aber beachten Sie, dass dies wahrscheinlich weniger effizient ist als die Listenverständnismethode):

import glob

data_files = glob.glob("path_to_files/*.fits")

light_files = np.setdiff1d( data_files, glob.glob("*BIAS*"))
light_files = np.setdiff1d(light_files, glob.glob("*FLAT*"))

(In meinem Fall hatte ich einige Bildrahmen, Bias-Rahmen und flache Rahmen in einem Verzeichnis und wollte nur die Bildrahmen.)

1
Ryan Farber

Sie können die folgende Methode verwenden:

# Get all the files
allFiles = glob.glob("*")
# Files starting with eph
ephFiles = glob.glob("eph*")
# Files which doesnt start with eph
noephFiles = []
for file in allFiles:
    if file not in ephFiles:
        noephFiles.append(file)
# noepchFiles has all the file which doesnt start with eph.

Thank you.  
0
KK2491