Ich habe ein Python-Skript geschrieben, in dem zwei CSV-Dateien zusammengeführt werden, und jetzt möchte ich der endgültigen CSV-Datei einen Header hinzufügen. Ich habe versucht, den hier gemeldeten Vorschlägen zu folgen, und habe den folgenden Fehler erhalten : expected string, float found
. Was ist der pythonischste Weg, um dies zu beheben?
Hier ist der Code, den ich verwende:
import csv
with open('combined_file.csv', 'w', newline='') as outcsv:
writer = csv.DictWriter(outcsv, fieldnames = ["Date", "temperature 1", "Temperature 2"])
writer.writeheader()
with open('t1.csv', 'r', newline='') as incsv:
reader = csv.reader(incsv)
writer.writerows(row + [0.0] for row in reader)
with open('t2.csv', 'r', newline='') as incsv:
reader = csv.reader(incsv)
writer.writerows(row[:1] + [0.0] + row[1:] for row in reader)
Antworten:
Die
DictWriter()
Klasse erwartet Wörterbücher für jede Zeile. Wenn Sie nur einen ersten Header schreiben wollten, verwenden Sie einen regulären Headercsv.writer()
und übergeben Sie den Header in einer einfachen Zeile:import csv with open('combined_file.csv', 'w', newline='') as outcsv: writer = csv.writer(outcsv) writer.writerow(["Date", "temperature 1", "Temperature 2"]) with open('t1.csv', 'r', newline='') as incsv: reader = csv.reader(incsv) writer.writerows(row + [0.0] for row in reader) with open('t2.csv', 'r', newline='') as incsv: reader = csv.reader(incsv) writer.writerows(row[:1] + [0.0] + row[1:] for row in reader)
Die Alternative wäre, beim Kopieren über Ihre Daten Wörterbücher zu generieren:
import csv with open('combined_file.csv', 'w', newline='') as outcsv: writer = csv.DictWriter(outcsv, fieldnames = ["Date", "temperature 1", "Temperature 2"]) writer.writeheader() with open('t1.csv', 'r', newline='') as incsv: reader = csv.reader(incsv) writer.writerows({'Date': row[0], 'temperature 1': row[1], 'temperature 2': 0.0} for row in reader) with open('t2.csv', 'r', newline='') as incsv: reader = csv.reader(incsv) writer.writerows({'Date': row[0], 'temperature 1': 0.0, 'temperature 2': row[1]} for row in reader)
quelle
csv
Modul möchte daher Zeilenumbrüche direkt verarbeiten (mit\n
und\r\n
nach Bedarf), was bedeutet, dass Sie die Datei im Binärmodus öffnen müssen. Siehecsv.reader()
Dokumentation : Wenn csvfile ein Dateiobjekt ist, muss es auf Plattformen, auf denen dies einen Unterschied macht, mit dem Flag 'b' geöffnet werden. . In Python 3 würden Sie stattdessen dienewline=''
Option verwenden.a
Modus geöffnetwriter.writeheader()
wird, wird der Header zweimal aufgeschrieben , obwohl die Header-Zeile bereits geschrieben wurde!writer.writeheader()
wenn an eine vorhandene Datei angehängt wird. Dascsv.writer()
Objekt kann nicht erkennen, dass Sie Daten in eine vorhandene Datei schreiben.Sie fügen nur eine zusätzliche Zeile hinzu, bevor Sie die Schleife ausführen. Diese Zeile enthält den Namen Ihres CSV-Dateikopfs.
schema = ['a','b','c','b'] row = 4 generators = ['A','B','C','D'] with open('test.csv','wb') as csvfile: writer = csv.writer(csvfile, delimiter=delimiter) # Gives the header name row into csv writer.writerow([g for g in schema]) #Data add in csv file for x in xrange(rows): writer.writerow([g() for g in generators])
quelle
Das hat bei mir funktioniert.
header = ['row1', 'row2', 'row3'] some_list = [1, 2, 3] with open('test.csv', 'wt', newline ='') as file: writer = csv.writer(file, delimiter=',') writer.writerow(i for i in header) for j in some_list: writer.writerow(j)
quelle