Seite 1 von 1

Frage zu einem regulären Ausduck

Verfasst: Dienstag 5. August 2008, 14:26
von Tompee
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

Verfasst: Dienstag 5. August 2008, 14:34
von Trundle
Weil die Liste während des Iterierens verändert wird, und das geht meist, wie man hier sieht, schief.

Verfasst: Dienstag 5. August 2008, 14:58
von audax

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

Verfasst: Dienstag 5. August 2008, 14:59
von Tompee
Danke für die schnellen Antworten, funktioniert jetzt alles bestens.