Frage zu einem regulären Ausduck

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
Tompee
User
Beiträge: 18
Registriert: Sonntag 7. Oktober 2007, 17:13

Hi,

ich versuche gerade mit Hilfe eines Scriptes doppelte Dateien herauszufiltern. Leider klappt das nicht so ganz.

Hiermal die Dateistruktur vom aktuellen Verzeichniss:

Code: Alles auswählen

Verzeichnis von C:\Users\Tompee\Desktop\test

05.08.2008  15:11    <DIR>          .
05.08.2008  15:11    <DIR>          ..
05.08.2008  14:12    <DIR>          BlaBla
05.08.2008  15:11               504 find.py
05.08.2008  14:13                 2 test(2).txt
05.08.2008  14:12                 1 test1(1).txt
05.08.2008  14:10                 0 test1.txt
05.08.2008  14:11                 0 test2.txt
05.08.2008  14:13                 1 test3(1).txt
05.08.2008  14:11                 0 test3.txt
               7 Datei(en),            508 Bytes
               3 Verzeichnis(se), 141.304.700.928 Bytes frei
Hier mein Code:

Code: Alles auswählen

#!/usr/bin/env python

import re
from os import listdir, getcwd
from os.path import isfile

data = listdir(getcwd())


for element in data:
	if not isfile(element):
		data.remove(element)


pattern = re.compile('.+\(\d+\)\.txt')
for element in data:
	if pattern.match(element):
		data.remove(element)

print data
Mein Ergebniss:

Code: Alles auswählen

['find.py', 'test1(1).txt', 'test1.txt', 'test2.txt', 'test3.txt']
Meine Frage ist nun, warum er die test1(1).txt nicht herausfiltert, obwohl der reguläre Ausdruck ja darauf passen müsste?

Gruss Tompee
Benutzeravatar
Trundle
User
Beiträge: 591
Registriert: Dienstag 3. Juli 2007, 16:45

Weil die Liste während des Iterierens verändert wird, und das geht meist, wie man hier sieht, schief.
"Der Dumme erwartet viel. Der Denkende sagt wenig." ("Herr Keuner" -- Bertolt Brecht)
audax
User
Beiträge: 830
Registriert: Mittwoch 19. Dezember 2007, 10:38

Code: Alles auswählen

import re
from itertools import ifilter
from os import listdir, getcwd
from os.path import isfile

pattern = re.compile(r'.+\(\d+\)\.txt')
data = listdir(getcwd())

files = ifilter(isfile, data)
unmatched = (e for e in files if not pattern.match(e))

for f in unmatched:
    print f
oder:

Code: Alles auswählen

import re
import operator as op
from itertools import ifilter
from functional import compose
from functools import partial
from os import listdir, getcwd
from os.path import isfile

pattern = re.compile(r'.+\(\d+\)\.txt')
data = listdir(getcwd())

filtered = compose(partial(ifilter, compose(op.not_, pattern.match)),
                   partial(ifilter, isfile)
              )(data)
for f in filtered:
    print f
oder:

Code: Alles auswählen

import re
from os import listdir, getcwd
from os.path import isfile

pattern = re.compile(r'.+\(\d+\)\.txt')
data = listdir(getcwd())

filtered = (f for f in data if isfile(f) and not pattern.match(f))

for f in filtered:
    print f
Zuletzt geändert von audax am Dienstag 5. August 2008, 15:12, insgesamt 2-mal geändert.
Tompee
User
Beiträge: 18
Registriert: Sonntag 7. Oktober 2007, 17:13

Danke für die schnellen Antworten, funktioniert jetzt alles bestens.
Antworten