【问题标题】:Append a Header for CSV file?为 CSV 文件附加标题?
【发布时间】:2015-01-27 02:40:57
【问题描述】:

我正在尝试向我的 CSV 文件添加标题。

我正在从一个 .csv 文件中导入数据,该文件有两列数据,每列都包含浮点数。示例:

  11   22
  33   44
  55   66

现在我想为两列添加一个标题,例如:

 ColA  ColB
  11    22
  33    44
  55    66

我试过这个:

with open('mycsvfile.csv', 'a') as f:
    writer = csv.writer(f)
    writer.writerow(('ColA', 'ColB'))

我使用'a' 附加数据,但这会将值添加到文件的底行而不是第一行。有什么办法可以解决吗?

【问题讨论】:

  • 你需要展示一个完整的例子来说明问题。
  • 我已经看到了这个问题,但我认为这与 .csv 文件的角度不同。
  • 没有办法只写入文件的开头。解决方法是写出整个文件,以新信息开头,
  • 您可以手动编辑文件吗?使用文本编辑器或将标题写入另一个文件,不要使用 python,而只需使用cat 将两者连接起来。您是否有数千个 CSV 文件需要附加标头?

标签: python csv


【解决方案1】:

一种方法是读入所有数据,然后用文件头覆盖文件并再次写出数据。对于大型 CSV 文件,这可能不切实际:

#!python3
import csv
with open('file.csv',newline='') as f:
    r = csv.reader(f)
    data = [line for line in r]
with open('file.csv','w',newline='') as f:
    w = csv.writer(f)
    w.writerow(['ColA','ColB'])
    w.writerows(data)

【讨论】:

    【解决方案2】:

    我认为您应该使用 pandas 来读取 csv 文件,插入列标题/标签,然后发出新的 csv 文件。假设您的 csv 文件是逗号分隔的。像这样的东西应该可以工作:

       from pandas import read_csv
    
       df = read_csv('test.csv')
       df.columns = ['a', 'b']
       df.to_csv('test_2.csv')
    

    【讨论】:

    • 感谢您的评论。当我这样做时,我的第一行被标题替换。如何在保留所有行的同时附加标题?谢谢
    【解决方案3】:

    我知道很久以前就有人问过这个问题。但是对于遇到这个问题的其他人来说,这里有一个 Python 的替代方案。

    如果您可以访问 sed(如果您在 Linux 或 Mac 上工作,则可以访问;您也可以在 Windows 10 上下载 Ubuntu Bash,sed 会附带它),您可以使用这个单行:

    sed -i 1i"ColA,ColB" mycsvfile.csv
    

    -i 将确保 sed 将就地编辑,这意味着 sed 将覆盖顶部带有标题的文件。这是有风险的。

    如果您想创建一个新文件,请执行此操作

    sed 1i"ColA,ColB" mycsvfile.csv > newcsvfile.csv
    

    【讨论】:

    • 不错的@MishalAhmed!
    【解决方案4】:

    在这种情况下,您不需要 CSV 模块。您需要 fileinput 模块,因为它允许就地编辑:

    import fileinput
    
    for line in fileinput.input(files=['mycsvfile.csv'], inplace=True):
        if fileinput.isfirstline():
            print 'ColA,ColB'
        print line,
    

    在上面的代码中,print 语句将打印到文件中,因为inplace=True 参数。

    【讨论】:

      【解决方案5】:

      对于CSV文件的第一行被表头替换的问题,我们需要添加一个选项。

      import pandas as pd  
      df = pd.read_csv('file.csv', **header=None**)  
      df.to_csv('file.csv', header = ['col1', 'col2']) 
      

      【讨论】:

        【解决方案6】:

        您可以将代码中的 reader.fieldnames 设置为列表 就像你的情况

         with open('mycsvfile.csv', 'a') as fd:
                reader = csv.DictReader(fd)
                reader.fieldnames = ["ColA" , "ColB"]
                for row in fd
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2021-07-15
          • 2021-02-19
          • 2021-06-28
          • 1970-01-01
          • 2021-11-26
          • 1970-01-01
          • 1970-01-01
          • 2015-12-02
          相关资源
          最近更新 更多