Kann mir jemand sagen, warum es nur für den ersten Schlüssel zu arbeiten?
reader = csv.reader (inFile) öffnet die Datei und beginnt mit dem Reeding von Anfang bis Ende. Es wird dann den Cursor am Ende verlassen. In den folgenden Iterationen hat es nichts zu lesen.
Wie behebt man diese (Quick-Fix-Version)?
with open(r"root\to\file", "r") as inFile:
for k in myDict.keys():
reader = csv.reader(inFile)
inFile.seek(0) # move cursor to start
result = [row[11] for row in reader if row[3] == k]
print(result)
Erklärung
Ich werde erläutern, was ich meine. Zuerst möchte ich Ihnen einige Beispieldaten geben, die ich in eine Datei schreibe (csv-Format).
import csv
dict_ = {"1":1, "2":3}
data = """date,id,weight
01/01/1991,1,293
01/02/1991,2,291
01/03/1991,3,289
"""
with open("output.txt","wt") as f:
f.write(data)
Nichtarbeitsbeispiel:
with open("output.txt") as f:
for keys in dict_:
reader = csv.reader(f) # <-- Opens file and reads it (cursor in end)
print([i for i in reader])
## Output
# >> [['date', 'id', 'weight'], ['01/01/1991', '1', '293'], ['01/02/1991', '2', '291'], ['01/03/1991', '3', '289']]
# >> []
Stattdessen verwenden:
with open("output.txt") as f:
for keys in dict_:
reader = csv.reader(f) # <-- Opens file and reads it (cursor in end)
f.seek(0) # <-- Return cursor to 0 (cursor is now in the start)
print([i for i in reader])
## Output
# >> [['date', 'id', 'weight'], ['01/01/1991', '1', '293'], ['01/02/1991', '2', '291'], ['01/03/1991', '3', '289']]
# >> [['date', 'id', 'weight'], ['01/01/1991', '1', '293'], ['01/02/1991', '2', '291'], ['01/03/1991', '3', '289']]
Oder einfach es zu einer lokalen Variablen zuerst lesen:
with open("output.txt") as f:
csvdata = list(csv.reader(f)) #or this
for key in dict_.keys():
[print(i) for i in csvdata if i[1] == key]
## Output
# >> ['01/01/1991', '1', '293']
# >> ['01/02/1991', '2', '291']
danke für deine Hilfe! Ich habe versucht, Ihre Top-Lösung, aber ich bekomme immer noch nur eine Antwort, jetzt ohne die leeren Listen ... irgendwelche Ideen? – pythonNovice
Ich sehe nicht, wie es scheitern könnte. Haben Sie die Lösung kopiert und eingefügt? Vielleicht gibt es nur einen Diktatschlüssel, der gleich einer Zeile [3] ist? Sie könnten 'row_list' drucken, um zu sehen, wie es aussieht. – Gribouillis
Ich übergab Variablen über Funktionen, wenn ich Ihre Lösung kopiere/einfüge, liefert sie, was ich brauche. – pythonNovice