2012-10-23 10 views
19
import glob 

list = glob.glob(r'*abc*.txt') + glob.glob(r'*123*.txt') + glob.glob(r'*a1b*.txt') 

for i in list: 
    print i 

Dieser Code arbeitet Dateien im aktuellen Verzeichnis aufzulisten, die ‚abc‘ ‚123‘ oder ‚A1B‘ in ihren Namen haben. Wie man einen glob verwendet, um diese Funktion zu machen, dankeregulären Ausdruck in glob.glob von Python mit

+1

"wie"? was wie? –

+0

Ich glaube nicht, dass du es kannst. Pythons Glob unterstützt '{}' nicht und ich denke, das ist so ziemlich die einzige Möglichkeit. – mgilson

Antwort

28

Der einfachste Weg wäre, die Glob-Ergebnisse selbst zu filtern. Hier ist, wie es zu tun, um eine einfache Schleife Verständnis mit:

import glob 
res = [f for f in glob.glob("*.txt") if "abc" in f or "123" in f or "a1b" in f] 
for f in res: 
    print f 

Sie auch einen regulären Ausdruck und keine glob verwenden:

import os 
import re 
res = [f for f in os.listdir(path) if re.search(r'(abc|123|a1b).*\.txt$', f)] 
for f in res: 
    print f 

(By the way, eine Variable list Namensgebung ist eine schlechte Idee, da list ist ein Python-Typ ...)

+2

Ich glaube, du meintest "oder" statt "und", oder? – Emmanuel

+0

@Emmanuel Ich bin mir nicht sicher ... OP schrieb über "Dateien, die 'abc', '123' * und * 'a1b' in ihren Namen haben. Aber wenn ich auf seinen Code schaue, dann rate ich' oder ' sei eine bessere Wahl.Thanks für das darauf hin. – Schnouki

+0

ja, es muss 'oder' hier :) Entschuldigung für mein schlechtes Englisch .. – user1561868

10

Hier ist eine gebrauchsfertige Art, dies zu tun, basierend auf den anderen Antworten. Es ist nicht die leistungsfähigste, aber es funktioniert wie beschrieben;

def reglob(path, exp, invert=False): 
    """glob.glob() style searching which uses regex 

    :param exp: Regex expression for filename 
    :param invert: Invert match to non matching files 
    """ 

    m = re.compile(exp) 

    if invert is False: 
     res = [f for f in os.listdir(path) if m.search(f)] 
    else: 
     res = [f for f in os.listdir(path) if not m.search(f)] 

    res = map(lambda x: "%s/%s" % (path, x,), res) 
    return res 
+0

Sollte das Wort 'match' verwenden, um die Namen vollständig zu finden, Downvoting – holdenweb

0
for filename in glob.iglob(path_to_directory + "*.txt"): 
    if filename.find("abc") != -1 or filename.find("123") != -1 or filename.find("a1b") != -1: 
     print filename 
+1

Könnten Sie der Antwort einige Erklärungen hinzufügen? – kvorobiev

+0

Die Idee besteht darin, die Liste der Namen der Dateien im Verzeichnis zu durchlaufen und diejenigen zu finden, die einen beliebigen Text haben Zeichenfolgen in ihrem Namen –

+0

in c Wenn Sie möchten, dass die Dateien, die alle Zeichenfolgen in ihrem Namen enthalten, nur das "oder" in "und" geändert werden müssen, –