Regular expression oder etwas anderes basteln ?

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Benutzeravatar
Gunnar
User
Beiträge: 68
Registriert: Samstag 23. Oktober 2004, 08:59

Samstag 4. Februar 2006, 08:26

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: )
modelnine
User
Beiträge: 670
Registriert: Sonntag 15. Januar 2006, 18:42
Wohnort: Celle
Kontaktdaten:

Samstag 4. Februar 2006, 08:45

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.
Benutzeravatar
Gunnar
User
Beiträge: 68
Registriert: Samstag 23. Oktober 2004, 08:59

Samstag 4. Februar 2006, 09:18

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
Benutzeravatar
Gunnar
User
Beiträge: 68
Registriert: Samstag 23. Oktober 2004, 08:59

Samstag 4. Februar 2006, 10:34

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
Benutzeravatar
Gunnar
User
Beiträge: 68
Registriert: Samstag 23. Oktober 2004, 08:59

Samstag 4. Februar 2006, 14:41

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
modelnine
User
Beiträge: 670
Registriert: Sonntag 15. Januar 2006, 18:42
Wohnort: Celle
Kontaktdaten:

Samstag 4. Februar 2006, 15:04

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.
Benutzeravatar
Gunnar
User
Beiträge: 68
Registriert: Samstag 23. Oktober 2004, 08:59

Samstag 4. Februar 2006, 15:22

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
modelnine
User
Beiträge: 670
Registriert: Sonntag 15. Januar 2006, 18:42
Wohnort: Celle
Kontaktdaten:

Samstag 4. Februar 2006, 15:38

querdenker
User
Beiträge: 424
Registriert: Montag 28. Juli 2003, 16:19
Wohnort: /dev/reality

Samstag 4. Februar 2006, 17:29

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
Benutzeravatar
Gunnar
User
Beiträge: 68
Registriert: Samstag 23. Oktober 2004, 08:59

Sonntag 5. Februar 2006, 12:48

Hi Querdenker,

Pyalamode ? Ist das nicht ein Codeeditor ?
querdenker hat geschrieben: mal aus der Session im pyalamode gezogen...
Gruss,
Gunnar
querdenker
User
Beiträge: 424
Registriert: Montag 28. Juli 2003, 16:19
Wohnort: /dev/reality

Sonntag 5. Februar 2006, 14:37

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
Antworten