Seite 1 von 1

Regular expression oder etwas anderes basteln ?

Verfasst: Samstag 4. Februar 2006, 08:26
von Gunnar
Hallo Pythons,

ich sitze mal wieder vor einem Script und weiss nicht wie ich hier weiterkomme :

Mittels os.walk gehe ich über ein Directory und seine Subdirectories. Nun möchte ich Einige ( ein oder mehrere Subdirectories ) nicht erfassen. Dafür habe ich eine Liste mit Strings, die die Namen der entsprechenden Directories enthält. Wenn ich nun einfach mit :

Code: Alles auswählen

for root, dirs, files in os.walk(rootfolder):
durch die Directories wandere und dort Daten erfasse, wie kann ich dann am besten die Directories aus meiner "exclude_list" aussparen ?

Gruss,
Gunnar ( der morgens um 6 aus dem Bett fiel :shock: )

Verfasst: Samstag 4. Februar 2006, 08:45
von modelnine
Wie sieht die exlude_list aus? Im Normalfall sollte ja sowas wie

Code: Alles auswählen

import re

exclude_dir = re.compile("(test|blah|blubb)")
for root, dirs, files in os.walk(rootfolder):
    if exclude_dir.match(root):
        continue
    <mach was>
tun.

--- Heiko.

Verfasst: Samstag 4. Februar 2006, 09:18
von Gunnar
Die liste kann beliebig aussehen....auch wie dein String in der RE....perfekt !
:D

Leider kenne ich mich mit RE's noch nicht so aus, deshalb wusste ich nicht, dass der |-Seperator für beliebig steht. Das steht zwar auch in der Doku, hab' ich allerdings überlesen ;)

Danke nochmal,

Gunnar

Verfasst: Samstag 4. Februar 2006, 10:34
von Gunnar
Wo wir schonmal bei RE's sind :

Warum schmeisst er nicht alle Einträge aus der Liste ??

Code: Alles auswählen

import re

suffix = '(yyy)'
files = ['jaja3.0004.dpx', 'jaja3.0005.dpx', 'jaja3.0006.dpx']
suffix_wanted = re.compile(suffix)

print files
for each in files:
    if not suffix_wanted.search(each):
        files.remove(each)
print files
Ich verstehe es nicht ;)


EDIT : irgendwie scheint das .remove Schuld zu haben...teste noch weiter

Verfasst: Samstag 4. Februar 2006, 14:41
von Gunnar
Hallo nochmal Pythons,

ich verstehe nicht, warum nur jedes zweite Element der Liste removed wird, obwohl die Bedingung erfüllt wird. Mein Problem ist eigentlich folgendes :

Ich habe eine Liste mit Dateinamen. In dieser möchte ich nur Dateinamen mit bestimmten Endungen stehen lassen, um danach eine Auswertung der Größe und Anzahl zu machen.
Doch auf dem Wege, den ich mir überlegt habe geht es anscheinend nicht.
Hat jemand eine Idee dazu ? :(

Code: Alles auswählen

import re

suffix = 'dpx3'
files = ['dpx1', 'dpx2', 'dpx3']
suffix_wanted = re.compile(suffix)
for each in files:
    if not suffix_wanted.match(each):
        files.remove(each)
        print "%s removed" %each
print files


Gruss,
Gunnar

Verfasst: Samstag 4. Februar 2006, 15:04
von modelnine
Iterieren über ein Objekt was verändert wird hat meißtens nicht die gewünschten Konsequenzen (bei Listen werden dann eine entsprechende Anzahl von Elementen übersprungen, bei Dicts bricht das Programm mit einer Exception ab).

Probier mal:

Code: Alles auswählen

match = re.compile(".*\\.dpx3")
files = ["hello.dat","hello.dpx2","hello.dpx3","test.dat","blah.dpx3"]
files = [i for i in files if match.match(i) is None]
print files
Das benutzt eine Listcomprehension, die im Endeffekt eine neue Liste erstellt die die Elemente nicht besitzt, und das dann an den Namen files bindet.

--- Heiko.

Verfasst: Samstag 4. Februar 2006, 15:22
von Gunnar
Hi Heiko,

kennst du eine Seite auf der mehr zu RE's gesagt wird ? In der Doku ist es ein bisschen schwer verständlich.

Diese Lösung passt perfekt, danke nochmal :)

Gunnar

Verfasst: Samstag 4. Februar 2006, 15:38
von modelnine

Verfasst: Samstag 4. Februar 2006, 17:29
von querdenker
Hi!

Das ganze geht auch ohne regex!

mal aus der Session im pyalamode gezogen...

Code: Alles auswählen

import os
for root, dirs, files in os.walk('e:/songs', topdown = False):
    for file in files:
        if os.path.splitext(file)[1]!=".mp3":
            print file
Das Snippet gibt alles aus, was nicht die Endung mp3 hat.
Aufpassen muß man, das man die Erweiterung mit dem "." eingibt(oder sich einen Helper schreiben) :)


mfg, querdenker

Verfasst: Sonntag 5. Februar 2006, 12:48
von Gunnar
Hi Querdenker,

Pyalamode ? Ist das nicht ein Codeeditor ?
querdenker hat geschrieben: mal aus der Session im pyalamode gezogen...
Gruss,
Gunnar

Verfasst: Sonntag 5. Februar 2006, 14:37
von querdenker
Hi Gunnar!

Ja, PyAlaMode ist der Editor / die Python-Shell von wxPython. Nehme ich ganz gerne, um mal kurz was auszuprobieren. Und wenn es dann klappt, kann ich den Code aus dem Session-Tab (unten) herauskopieren.

mfg, querdenker