Я написал сценарий 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)
Ответы:
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)
источник
csv
таким образом модуль хочет обрабатывать переводы строк непосредственно (\n
и\r\n
в случае необходимости), что означает , что вы должны открыть файл в двоичном режиме. См.csv.reader()
Документацию : Если csvfile является файловым объектом, он должен быть открыт с флагом 'b' на платформах, где это имеет значение. . В Python 3 вы бы вместо этого использовали этуnewline=''
опцию .a
режиме,writer.writeheader()
дважды записывает заголовок, несмотря на то, что строка заголовка уже была записана!writer.writeheader()
при добавлении к существующему файлу.csv.writer()
Объект не может обнаружить , что вы пишете данные в существующий файл.Вы просто добавляете одну дополнительную строку перед выполнением цикла. Эта строка содержит имя заголовка вашего 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])
источник
Это сработало для меня.
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)
источник