以 Python 方式将标头添加到 csv 文件
Posted
技术标签:
【中文标题】以 Python 方式将标头添加到 csv 文件【英文标题】:Pythonically add header to a csv file 【发布时间】:2013-12-19 07:26:54 【问题描述】:我编写了一个合并两个 csv 文件的 Python 脚本,现在我想在最终的 csv 中添加一个标题。我尝试按照here 报告的建议进行操作,但出现以下错误:expected string, float found
。解决这个问题的最 Pythonic 方法是什么?
这是我正在使用的代码:
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:大部分贴出的代码来自this previous question by the OP 【参考方案1】: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 文件显然是文本,而不是二进制格式。这可能会导致 Windows 系统出现问题。 @pcarter:在 Python 2 上,在 Windows 上以文本模式打开文件会触发与 CSV 格式不兼容的换行翻译;因此,csv
模块想要直接处理换行符(根据需要使用\n
和\r\n
),这意味着您必须以二进制模式打开文件。请参阅csv.reader()
documentation:如果 csvfile 是文件对象,则必须在不同的平台上使用“b”标志打开它。。在 Python 3 上,您将改用 newline=''
option。
这行得通,有趣的是:当文件以a
模式打开时,writer.writeheader()
会写下两次标题,尽管标题行已经写好了!
@loretoparisi:当然可以。附加到现有文件时不要使用writer.writeheader()
。 csv.writer()
对象无法检测到您正在将数据写入现有文件。
在 Python 3 中,需要使用 'w' 选项打开文件,二进制文件不起作用。在答案中提及这一点会很有用。我在这里发现了这个区别:***.com/questions/34283178/…【参考方案2】:
您只需在执行循环之前添加一行。此行包含 您的 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)
【讨论】:
使用文件作为变量不是一个好主意。第 3 行。请改用 csvfile 或其他文件。 @Gorgonzola 这只是 *** 答案中的语法名称......它可能是香蕉,但在这种情况下它只是一个文件【参考方案4】:如果我们在创建文件时只添加标题而不是附加数据,这不是很简单..
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)
【讨论】:
以上是关于以 Python 方式将标头添加到 csv 文件的主要内容,如果未能解决你的问题,请参考以下文章
是否可以以相同或不同的顺序将具有相同标题或标题子集的多个 csv 文件读取到 spark 数据帧中?