Добавление заголовка в файл csv на Python

85

Я написал сценарий Python, объединяющий два файла CSV, и теперь я хочу добавить заголовок к окончательному CSV. Я попытался следующие предложения сообщили здесь , и я получил следующее сообщение об ошибке: expected string, float found. Какой самый питонический способ исправить это?

Вот код, который я использую:

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)
albus_c
источник
сколько столбцов вы записываете в свой CSV-файл? Не могли бы вы указать в своем вопросе 1. Формат ввода вашего файла 2. Формат вывода
nio
@nio: Большая часть опубликованного кода взята из предыдущего вопроса ОП
Мартин Питерс

Ответы:

116

DictWriter()Класс ожидает , что словари для каждой строки. Если все, что вы хотели сделать, это написать начальный заголовок, используйте обычный csv.writer()и передайте простую строку для заголовка:

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)

Альтернативой может быть создание словарей при копировании ваших данных:

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)
Мартейн Питерс
источник
1
Почему файлы открываются в двоичном режиме? Файлы csv имеют явно текстовый, а не двоичный формат. Это могло вызвать проблемы в системах Windows.
pcarter
3
@pcarter: в Python 2 открытие файла в текстовом режиме в Windows запускает перевод новой строки, несовместимый с форматом CSV; csvтаким образом модуль хочет обрабатывать переводы строк непосредственно ( \nи \r\nв случае необходимости), что означает , что вы должны открыть файл в двоичном режиме. См. csv.reader()Документацию : Если csvfile является файловым объектом, он должен быть открыт с флагом 'b' на платформах, где это имеет значение. . В Python 3 вы бы вместо этого использовали эту newline=''опцию .
Мартин Питерс
Это работает, забавная вещь: когда файл открывается в aрежиме, writer.writeheader()дважды записывает заголовок, несмотря на то, что строка заголовка уже была записана!
loretoparisi 09
2
@loretoparisi: конечно, есть. Не используйте writer.writeheader()при добавлении к существующему файлу. csv.writer()Объект не может обнаружить , что вы пишете данные в существующий файл.
Martijn Pieters
В Python 3 необходимо открыть файл с опцией 'w', двоичный файл не будет работать. Об этом было бы полезно упомянуть в ответе. Я нашел эту разницу здесь: stackoverflow.com/questions/34283178/…
Кристоф
6

Вы просто добавляете одну дополнительную строку перед выполнением цикла. Эта строка содержит имя заголовка вашего CSV-файла.

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])
Митул Панчал
источник
3

Это сработало для меня.

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)
провисать
источник
1
использование файла в качестве переменной - не лучшая идея. Строка №3. Вместо этого используйте csvfile или какой-нибудь другой.
Gorgonzola