2016-08-08 13 views
0

Ich habe eine .CSV, die ich versuche, einzelne Zeilen zu lesen, machen Berechnungen aus einzelnen Werten in den Zeilen, dann hängen Sie die aus den Berechnungen resultierenden Werte an das Ende dieser Zeile an. Mein Ansatz besteht darin, durch jede Zeile zu iterieren, den Wert aufzurufen, die Berechnung von diesem Wert aus vorzunehmen und dann an diese Zeile anzufügen. Hier ist der aktuelle Code (an einem Punkt habe ich es geschafft, alle Berechnungen an die letzte Zeile der CSV-Zeile anzuhängen, was vielversprechend aber falsch war. Im Moment bekomme ich einen '' _csv.writer 'Objekt ist nicht iterierbar' type error):Ich muss einzelne Zeilen in einer CSV lesen, Berechnungen aus Werten in diesen Zeilen (x2) vornehmen und diese Zeilen dann mit den neuen Werten anfügen

import csv 
import math 

f = open('planet_data.csv','a+') 
writer = csv.writer(f) 

for row in writer:     <- loction of error 
    if row[1] == 'Planet_Radius': <- To bypass csv header values 
     pass 
    else: 
     a = int(row[1]) 
     b = str((4/3)*math.pi*(a**3)) 
     row.writerow(b) 
     print row 

Jede Hilfe würde geschätzt, ich den Code erraten wird noch nach dem Iterator Problem arbeiten müssen behoben ist. Ich vermute auch, dass es Pakete/Module gibt, die das vereinfachen können, aber der Zweck dieser Übung ist es, zu lernen, wie man csvs manuell durchläuft.

+0

Es wäre einfacher und sicherer, in eine zweite CSV-Datei zu schreiben. Schließlich werden Sie auf ein unausgefülltes Zitat stoßen oder auf etwas, das Sie nicht erwartet haben, und Ihr Programm wird abstürzen und Sie mit einer beschädigten, teilweise aktualisierten Datei verlassen. –

Antwort

0

Ich glaube nicht, dass Sie in der Lage sein wird, Änderungen in der gleichen Datei zu schreiben, Sie können jedoch ein neues auf diese Weise erstellen:

with open("planet_data.csv", "rb") as infile, open('planet_data_2.csv', "wb") as outfile: 
    reader = csv.reader(infile) 
    next(reader, None) # skip the header 
    writer = csv.writer(outfile) 
    for row in reader: 
     a = int(row[1]) 
     b = str((4/3)*math.pi*(a**3)) 
     writer.writerow(b) 

Ich hoffe, das hilft!