2016-04-05 4 views
0

Ich versuche, die Daten aus einer CSV-Datei zu bekommen, in eine Liste von Tupeln zu trennen, Sachen damit zu tun, dann speichern Sie die Änderungen zurück in die CSV-Datei. Mein Problem ist, dass anstelle der Daten, die ich habe, die Änderungen als neue Zeilen am Ende meiner Datei hinzugefügt werden. Ich versuche zu vermeiden, die Datei erneut zu öffnen und das csv-Modul zu verwenden. Im folgenden Code öffne ich es, speichere es als meine Liste von Tupeln und versuche es wieder in der Datei zu speichern, aber es hängt stattdessen die Datei an.Öffnen von csv mit r + und es ist das Schreiben an das Ende der Datei

items_data = open("test.csv", "r+") 
my_list = items_data.read().strip().split('\n') 
for line in range(len(my_list)): 
    my_list[line] = tuple(my_list[line].split(",")) 
for i in range(len(my_list)): 
    for a in range(0,4): 
     if a==3: 
      items_data.write(my_list[i][a] + "\n") 
     else: 
      items_data.write(my_list[i][a] + ",") 
items_data.close() 
+0

Es ist normalerweise besser, Daten in eine neue Datei zu schreiben und sie dann umzubenennen, wenn alles in Ordnung war. Andernfalls könnte die Datei fehlerhaft sein, wenn Ihr Programm einen Laufzeitfehler aufweist. – Marichyasana

Antwort

0

'r +' öffnet die Datei zum Lesen und Schreiben. Wenn Sie den Ort nicht mit f.seek (offset) angeben, wird das Schreiben am Ende sein. Anstatt also zu versuchen, den Offset-Wert für jede Zeile herauszufinden, wäre es einfacher, die gesamte Datei zu lesen und jede Zeile zu verarbeiten und das Ganze wieder in eine Datei zu schreiben.

0

Lesen von der Datei verschiebt den "Dateizeiger". Da Sie alle Zeilen gelesen haben, zeigt der Dateizeiger jetzt auf das Ende der Datei. Am Ende der Datei finden also weitere Schreibvorgänge statt.

vom Anfang der Datei zu schreiben, müssen Sie, indem Sie den Dateizeiger auf den Anfang der Datei zurückgesetzt werden, bevor Sie Daten beginnen zurück zu schreiben:

sollte wie
items_data.seek(0,0) 

Ihr modifizierten Code aussehen:

items_data = open("test.csv", "r+") 
my_list = items_data.read().strip().split('\n') 
for line in range(len(my_list)): 
    my_list[line] = tuple(my_list[line].split(",")) 

# rewind file pointer to the start of the file 
items_data.seek(0,0) 

for i in range(len(my_list)): 
    for a in range(0,4): 
     if a==3: 
      items_data.write(my_list[i][a] + "\n") 
     else: 
      items_data.write(my_list[i][a] + ",") 
items_data.close() 
Verwandte Themen