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 hier und ich habe folgenden Fehler erhalten: expected string, float found. Was ist der pythonischste Weg, um dies zu beheben?

Hier ist der Code, den ich benutze:

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)
85
albus_c 3 Dez. 2013 im 13:52

3 Antworten

Beste Antwort

Die Klasse DictWriter() erwartet Wörterbücher für jede Zeile. Wenn Sie nur einen ersten Header schreiben wollten, verwenden Sie ein reguläres csv.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)
101
Martijn Pieters 10 Juli 2019 im 16:26

Sie fügen nur eine zusätzliche Zeile hinzu, bevor Sie die Schleife ausführen. Diese Zeile enthält den Namen Ihrer CSV-Datei.

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])
6
Mitul Panchal 8 Dez. 2017 im 09:00

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)
2
saggzz 13 Juni 2018 im 13:37