2016-05-10 21 views
0

Ich habe Probleme mit Python 2.7.10. Ich versuche, ein Programm zu erstellen, das schließlich eine CSV-Datei öffnet, Zahlen aus der Datei liest, Berechnungen mit den Zahlen durchführt und zurück in die CSV-Datei schreibt.Lesen von und Schreiben in CSV-Dateien

Der Code (d. H. Die Berechnungen) ist nicht fertig, ich wollte nur ein paar kleine Bits versuchen, damit ich anfangen konnte, Probleme zu identifizieren. Die Daten in der CSV-Datei wie folgt aussehen:

['110000,75000\n', '115000,72500\n', '105000,85250\n', '100000,70000'] 

Eine Sache, die ich Probleme habe mit richtig den CSV-Strings in Zahlen umzuwandeln und dann Python erklärt, welche Zeile, Spalte I in der Berechnung verwendet werden soll; etwas wie Zeile (0), Spalte (0) - Zeile (1) Spalte (1).

Ich habe ein paar verschiedene Dinge ausprobiert, aber es scheint auf dem Konvertieren zu Zahlen-Bit zu stürzen. Fehlermeldung ist TypeError int() argument must be a string or a number, not list ODER IOError File not open for string - je nachdem, was ich versucht habe. Kann mir jemand in die richtige Richtung zeigen?

import csv 

def main(): 
    my_file = open('InputData.csv','rU') 
    #test = csv.writer(my_file, delimiter=',') 

    file_contents = my_file.readlines() 
    print file_contents 

    for row in file_contents: 
     print row 

    #convert to numbers 
    #val0 = int(file_contents.readlines(0)) 
    #val1 = int(file_contents.readlines(1)) 
    #val0 = int(my_file.readlines(0)) 
    #val1 = int(my_file.readlines(1)) 

    #perform calculation 
    #valDiff = val1 - val0 

    #append to third column, may need to be in write file mode, num to strings 
    #file_contents.append 
    my_file.close() 

main() 
+2

Mögliches Duplikat von [Lesen und Schreiben von Daten in CSV-Dateien in Python] (http://stackoverflow.com/questions/34605150/reading-and-writing-data-in-csv-files-in-python) –

Antwort

0

Die Liste file_contents jetzt alle Ihre Excel-Daten enthält, versuchen, so readlines verwenden wahrscheinlich nicht auf der Liste Art funktionieren wird. Ich würde versuchen

row0 = file_contents[0].split(",") 

Welches sollte Ihnen die erste Zeile in einem Listenformat geben. Sie sollten dies (und müssen es höchstwahrscheinlich) in eine Schleife legen, um Excell Sheets jeder Größe abzudecken, die Sie haben. Dann

val0 = int(row0[0]) 

sollte Ihnen den Wert geben, den Sie wollen. Aber ich würde es wiederholen, um Zeit und Mühe zu sparen.

+0

OK Ich habe versucht, Ihren Vorschlag zu spalten, aber ich bekomme nicht, was ich dachte, ich würde. Wenn Ispilt file_contents [0] bekomme ich 110000, was ich erwarte, aber wenn ich dies zu file_contents [1] ändere, bekomme ich 72500 (was Zeile 1, col1 ist) - ich hätte aber, dass ich 115000 bekommen hätte. Also was bin ich falsch machen, um die Zeilen und Spalten zu trennen, damit ich Berechnungen an ihnen vornehmen kann? –

+0

Der Schlüssel hier ist, dass Sie mit jeder Split-Operation eine weitere Liste erstellen sollten. Und diese Liste sollte jede Zeile enthalten. Wenn das nicht gut für dich funktioniert, versuche die Antwort von alec_djinn. Es funktioniert nach dem gleichen Prinzip, kann aber Ihrer Denkweise besser dienen. –

0

Unter der Annahme, dass die Datei im Textformat ist, und dass Sie nicht möchten, dass eine dritte Partei Bibliothek wie pandas verwenden dann wäre dies der einfachste Weg, es zu tun:

data = [] 

with open('InputData.csv','r') as my_file: 
    for row in my_file: 
     columns = row.split(',') #clean and split 
     data.append([int(value) for value in columns]) 

print(data[0][0]) #row=0 col=0 
print(data[0][1]) #row=0 col=1 
0

Ich denke, dies wird tun Was Sie wollen:

import csv 

def main(filename): 
    # read entire csv file into memory 
    with open(filename, 'rb') as my_file: 
     reader = csv.reader(my_file, delimiter=',') 
     file_contents = list(reader) 

    # rewrite file adding a difference column 
    with open(filename, 'wb') as my_file: 
     writer = csv.writer(my_file, delimiter=',') 
     for row in file_contents: 
      val0, val1 = map(int, row) 
      difference = val1 - val0 
      #print(val0, val1, difference) 
      writer.writerow([val0, val1, difference]) 

if __name__ == '__main__': 
    main('InputData.csv') 

Seien Sie vorsichtig, wenn Sie dies verwenden, weil es die Datei neu schreiben wird. Zum Testen und Debuggen sollten Sie die Ergebnisse in eine zweite Datei mit einem anderen Namen schreiben.