Daten aus csv-Datei extrahieren

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
aug_lager
User
Beiträge: 26
Registriert: Sonntag 4. Januar 2015, 12:01

Hallo liebes Forum,

ich habe ein Problem mit einem kleinen Code-Schnippsel, das nicht tut, was ich möchte. Aus ein csv-Datei möchte ich Daten nach einem bestimmten Schema extrahieren. Die Datei enthält lediglich eine Spalte mit Zahlen, die mindestens 2 Stellen haben. Die ersten beiden Ziffern beginnen mit 20 und sie reichen bis 99. Ich möchte nun alle Zahlen, die mit den gleichen zwei ersten Ziffern beginnen, in eine eigene Liste überführen. Nachdem eine solche Liste erstellt wurde, soll sie bearbeitet und anschließend geleert werden. Das soll der unten stehende Code machen.

Code: Alles auswählen

import csv
reader = csv.reader(open("Beispieldaten.csv"))

collection = []

for i in range(20,100):
    for row in reader:
        if row[0].startswith(str(i)):
            collection.append(row[0])
            
    # do something with collection...
    
    collection = []
In Ansetzen tut er das auch, nämlich immer für den ersten angebenen Wert in "range". Beginnt das mit 20, dann sucht er mit alle Werte mit 20 heraus. Die folgenden Listen bleiben aber leer. Ich kann beim besten Willen nicht erkennen, woran das liegen soll. Weiß jemand von euch vielleicht Rat?
nezzcarth
User
Beiträge: 1634
Registriert: Samstag 16. April 2011, 12:47

aug_lager hat geschrieben:Die folgenden Listen bleiben aber leer. Ich kann beim besten Willen nicht erkennen, woran das liegen soll. Weiß jemand von euch vielleicht Rat?
Der Iterator wird beim ersten Durchlauf aufgebraucht und ist danach leer. Du könntest das gewünschte Verhalten herbeiführen, indem du in Zeile 2 eine Liste erzeugst. Meiner Meinung nach gibt es da aber schönere Lösungen

Schwebt dir so etwas vor?

Code: Alles auswählen

In [38]: import csv
In [39]: from collections import defaultdict
In [40]: result = defaultdict(list)
In [41]: with open('tmp.csv') as fh:
    rows = csv.reader(fh)
    for row in rows:
        item = row[0]
        result[item[:2]].append(item)
   ....:         
In [42]: result
Out[42]: 
defaultdict(list,
            {'17': ['173'],
             '20': ['20', '201', '2001'],
             '21': ['212'],
             '33': ['33', '33'],
             '39': ['39'],
             '57': ['57'],
             '99': ['991']})
Das passt nicht ganz zu dem Vorgehen, das du beschreibst (Liste erstellen, bearbeiten, neue Liste erstellen, bearbeiten ...), erscheint mir jedoch sinnvoller.
Wenn es sich tatsächlich nur um eine Datei handelt, in der pro Zeile eine Zahl und nichts weiter steht, könnte man auf das CSV-Modul auch verzichten.
Antworten