使用Python为CSV文件添加表头

119

我编写了一个Python脚本,用于合并两个csv文件,现在我想在最终的csv文件中添加标题。我尝试按照此处建议的方法操作,但是我收到了以下错误提示:expected string, float found。如何最符合Python风格地解决这个问题?

这是我正在使用的代码:

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
@nio:发布的大段代码来自于该用户的此前一个问题 - Martijn Pieters
4个回答

166
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)

这个没问题,有趣的是:当文件以a模式打开时,即使标题行已经写过了,writer.writeheader()会再次写入标题! - loretoparisi
3
当你向现有文件追加数据时,请不要使用writer.writeheader()csv.writer()对象无法检测到你正在向现有文件写入数据。 - Martijn Pieters
在写标题之前,应该检查是否有记录需要写入,并且只有在文件开头时才写入标题。 - undefined

14

在执行循环之前,您只需添加一个额外的行。此行包含您的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])

6
这对我很有用。
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)

3
使用文件作为变量不是一个好主意。第三行。使用csvfile或其他替代。 - Gorgonzola
2
@Gorgonzola 这只是一个 StackOverflow 答案中的语法名称... 它可能是香蕉,但在这种情况下它只是一个文件。 - Nícolas Schirmer

2
如果我们在创建文件时添加标题,那么这不是很简单吗?如果没有标题,就将数据附加到其中。
  conso_file_path = 'your_folder_path\your_file.csv'
    # Create File
    if not os.path.exists(conso_file_path):
        print("No File")
        header = ['col_name 1', 'col_name 1', 'col_name 3', 'col_name4']
        with open(conso_file_path, 'w') as f:
            writer = csv.writer(f)
            writer.writerow(header)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接