In `find_digits()` verwendest Du `regexp` ohne das man einfach nachvollziehen kann, wo der Wert dafür eigentlich her kommt. Man muss die komplette `get_inhalt()`-Funktion verstehen um zu sehen wo und wie der Name dort an einen oder mehrere Werte gebunden wird. Deshalb würde ich den regulären Ausdruck dort als Argument übergeben.
Die Funktion finde ich aber sowieso etwas übertrieben. Wenn man das „inline” schreibt und statt der Behandlung des `AttributError` das Ergebnis der Suche an einen Namen bindet und damit dann nur weiter macht wenn das Ergebnis nicht `None` ist, kann man das ganze kürzer schreiben und sich auch den unnötigen doppelten Aufruf von `find_digits()` sparen.
Zu den Gruppennamen: Schau Dir doch bitte mal an was das Wörterbuch enthält. Ein Wörterbuch in eine Liste mit Tupeln aus Schlüssel/Wert-Paare umzuwandeln um dann per verschachtelten Indexzugriff auf einen Wert zuzugreifen ist umständlich und wie gesagt auch *falsch*! Wenn das bei Dir funktioniert, dann ist das reiner Zufall, denn Wörterbücher haben keine Ordnung. Du fragst mit Deinem Code *irgendeinen* zufälligen Wert ab. Das würde nur funktionieren wenn das Wörterbuch nur einen Wert enthalten würde, aber dann wäre die Datenstruktur und der umständliche Zugriff noch unsinniger.
Der Schleifenkörper ist immer noch viel zu aufgebläht. Wenn etwas am Anfang oder Ende von *jedem* möglichen Zweig passiert, dann muss man das nicht in *jeden* Zweig reinschreiben, sondern *einmal* an passender Stelle. ``daten.append(tuple(r))`` wird in jedem Fall (fast) am Ende der Ausführung eines Schleifendurchlaufs gemacht. Das kann man deshalb auch *einmal* am Ende der Schleife machen. Damit sparst Du zwei ``else``-Zweige. Genau so kann man das erhöhen von `wert` aus dem ``if``/``else`` heraus ziehen. Und von dem Konstrukt bleibt auch nur noch das ``if`` wenn man mal überlegt was denn schlimmes passiert wenn man bei der '1' Tausenderzeichen entfernt.
`wert` ist übrigens ein ziemlich schlechter Name, weil nichtssagend. Denn ein Wert ist letztendlich *alles* was man an einen Namen binden kann. Namen sollten beschreiben wofür der daran gebundene Wert steht. In diesem Fall zum Beispiel scheint das die Anzahl der veränderten Datensätze zu sein.
Man könnte das wie folgt eindampfen (ungetestet):
Code: Alles auswählen
def whatever(filename, beschreibung, ve, inhalt, suchmuster):
regexp = re.compile(suchmuster, re.U | re.I)
changes = False
daten = set()
with open(filename, 'r') as infile:
for row in my_reader(infile):
if row[ve] == 'VE' and row[inhalt] == '1':
match = regexp.search(row[beschreibung])
if match:
row[inhalt] = (match.group('VALUE') or '1').replace('.', '')
changes = True
daten.add(tuple(row))
if changes:
write_csv(filename, sorted(daten))