2017-06-26 1 views
0

Ich arbeite an einem Skript, das die csv.reader() ein paar Mal im Skript verwenden muss. Ich verwende es zu einem frühen Zeitpunkt im Skript, um eine Tabelle sqlite3 mit ersten Primärschlüsseldaten zu füllen. Ich benutze es später wieder, um die Daten der Tabelle basierend auf dem, was in der CSV ist, zu ändern (es gibt einen legitimen Grund für diese Bestellung, verspreche ich).python's csv.reader in Python scheint nicht wirklich irgendwelche Daten zu bekommen

Das Problem tritt beim zweiten Mal auf - meine sqlite3-Tabelle ist definitiv mit dem ersten csv-Reader gefüllt, was bedeutet, dass die erste csv.reader() funktioniert, weil dort die Daten herkommen. Wenn ich später darüber iteriere, gibt es jedoch keine Daten. Es sieht so aus, als ob die csv.reader() vollständig leer ist.

Erlaubt csv.reader() nur ein csv.reader() - Objekt pro Skript? Ich kann mir nicht vorstellen, dass das die Situation ist.

Hier ist der Code ist, das funktioniert: (auffüllt meine Tabelle mit Anfangsdaten)

for file in files: 
    f = open(file) 
    csv_f = csv.reader(f) 
    count = 0 
    for row in csv_f: 
     #more code 
    f.close() 

Hier ist der Code, der später nicht mehr im selben Skript tut:

for file in files: 
    print "opening file ", file 
    f = open(file) 
    csv_n = csv.reader(f) 
    count = 0 
    thisList = list(csv_n) 

Die Art des Casting Liste ist nicht das, was ausflippt, oder? Ich bin ernsthaft ratlos, wie ich dieses Problem beheben kann.

>>> import csv 
>>> f = open("ooo.csv", "rb") 
>>> r = csv.reader(f) 
>>> list(r) 
[['a', 'b', 'c'], ['1', '2', '3']] 

Es ist nicht eine „Typumwandlung“ (Hinweis: es gibt nicht so etwas wie „typecasting“ in Python)

+0

öffnen Sie Ihre Datei mehrmals oder verwenden Sie das 'f' Handle erneut? Denn wenn Sie am Ende der Datei stehen, ist es kein Wunder, warum es beim zweiten Mal scheitert. –

+0

Haben Sie die Datei nach dem ersten Öffnen geschlossen? Verwenden Sie 'f.close()', nachdem Sie die Tabelle initialisiert haben. Auch die Verwendung einer 'with'-Anweisung schützt Sie vor solchen Fehlern. –

+0

Ich benutze den f-Griff, aber ich habe die Datei jedes Mal geschlossen. Am Ende der ersten Iteration schließe ich die Datei. Ich werde das Beispiel aktualisieren, um das zu zeigen. Und um sicherzugehen, dass das nicht das Problem war, habe ich den Griff umbenannt. Das Problem besteht immer noch. – dmcoding

Antwort

0

Der list(csv_n) Ausdruck wird eine list der csv Reihen erzeugen, und wird nicht Ändern Sie Ihre "CSV" in etwas anderes.

>>> r 
<_csv.reader object at 0x7f34964b7600> 

Eigentlich ist es genau das gleiche wie wenn Sie die Liste manuell gebaut hatte, das heißt mit:

>>> lst = [] 
>>> for row in r: 
>>> lst.append(row) 

aber ein bisschen schneller und mit weniger Code.

Der einzige Nebeneffekt ist, dass - genau wie bei der manuellen Iteration - die ganze Datei gelesen wird und der Dateizeiger am Ende der Datei gesetzt wird, um den gleichen CSV-Reader (oder die Datei) wiederzuverwenden selbst) wird nicht wie erwartet funktionieren. Wenn Sie die csv neu lesen möchten, müssen Sie den Dateizeiger am Anfang zurück:

>>> r.next() 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
StopIteration 
>>> f.seek(0) 
>>> r.next() 
['a', 'b', 'c'] 

So was auch immer Ihr Problem ist („alles ist kaputt“ ist ein völlig nutzlos Problembeschreibung BTW), ist es nicht mit list(csv_n) aber höchstwahrscheinlich mit nicht zu verstehen, was es tut.

NB: Sie später schreiben, dass

Allerdings, wenn ich durchlaufen, es gibt keine Daten vorhanden sind. Es sieht aus wie der csv.reader() ist total leer

Wenn Sie versuchen, über csv_nnach die thisList = list(csv_n) Linie zu durchlaufen, dann natürlich Sie werden nichts bekommen, über cf. Einfach den Dateizeiger zum Anfang zurückspulen und schon ist alles in Ordnung.

Verwandte Themen