pythoncsvheader

Pythonically add header to a csv file


I wrote a Python script merging two csv files, and now I want to add a header to the final csv. I tried following the suggestions reported here and I got the following error: expected string, float found. What is the most pythonic way to fix this?

Here is the code I am using:

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)

Solution

  • The DictWriter() class expects dictionaries for each row. If all you wanted to do was write an initial header, use a regular csv.writer() and pass in a simple row for the header:

    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)
    

    The alternative would be to generate dictionaries when copying across your data:

    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)