【问题标题】:Pythonically add header to a csv file以 Python 方式将标头添加到 csv 文件
【发布时间】: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

标签: python csv header


【解决方案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' 选项打开文件,二进制文件不起作用。在答案中提及这一点会很有用。我在这里发现了这个区别:stackoverflow.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 这只是 StackOverflow 答案中的语法名称......它可能是香蕉,但在这种情况下它只是一个文件
    【解决方案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)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-12-02
      • 2013-03-05
      • 1970-01-01
      相关资源
      最近更新 更多