Python将标头添加到CSV文件


84

我编写了一个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)

您要在csv文件中写入几列?您能否在问题中指定1.文件的输入格式2.输出格式
nio 2013年

@nio:发布的代码大部分来自OP的上一个问题
Martijn Pieters

Answers:


115

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

2
@loretoparisi:当然可以。writer.writeheader()追加到现有文件时不要使用。该csv.writer()对象无法检测到您正在将数据写入现有文件。
马丁·彼得斯

在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)
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.