【问题标题】:How to check CSV file header [closed]如何检查 CSV 文件头 [关闭]
【发布时间】:2013-08-06 17:08:02
【问题描述】:

说我有两个字典

dict1 = {'name':'Leo','age':'15','tel':'123456789'}
dict2 = {'name':'Zac','age':'20','tel':'987654321'}

我想将这两个字典写入 csv 文件。我可以将一个字典写入一个标题位于表顶部的 csv 文件,但是当我将第二个字典添加到同一个 csv 文件时,它会在最后一次输入之后写入另一个标题。所以我想知道是否有办法检查标题是否已经存在,如果没有,添加标题,否则只需添加新的字典数据

【问题讨论】:

    标签: python csv


    【解决方案1】:

    不清楚你的问题是什么,所以我将不得不猜测。如果您想要一个更具体的答案,而不是模糊的概括,您需要写一个更具体的问题。

    我怀疑你有这样的代码:

    with open('output.csv', 'w') as f:
        dw = csv.DictWriter(f, ('name', 'age', 'tel'))
        dw.writeheader()
        dw.writerow(dict1)
    
    with open('output.csv', 'a') as f:
        dw = csv.DictWriter(f, ('name', 'age', 'tel'))
        dw.writeheader()
        dw.writerow(dict2)
    

    问题是你的输出看起来像这样:

    name,age,tel
    Leo,15,123456789
    name,age,tel
    Zac,20,987654321
    

    当你想要这个时:

    name,age,tel
    Leo,15,123456789
    Zac,20,987654321
    

    如果是这样,解决这个问题的正确方法是不要第二次调用writeheader。根据您的代码的结构,这可能就像不在某处调用它一样简单。

    但是假设你有一些包装函数,像这样:

    def add_to_csv(row):
        with open('output.csv', 'a') as f:
            dw = csv.DictWriter(f, ('name', 'age', 'tel'))
            dw.writeheader()
            dw.writerow(row)
    

    而且你不能改变它,你希望它只在文件为空的时候才写标题。

    有几种不同的方法可以判断文件是否为空。假设您已经在'a' 模式下打开了文件,那么一个简单的方法就是检查f.tell() 是否为非零值。或者您可以检查os.fstat(f.fileno()).st_size 是否为非零值。

    但是,如果您在程序的一次运行中完成所有写入,那么只在脚本中跟踪可能会更干净。同样,您可以将 openDictWriter 代码移到实例/全局级别,而不是函数/方法的本地。或者你可以添加一个实例/全局标志来跟踪你是否已经调用了writeheader

    【讨论】:

      【解决方案2】:

      确定

      headers_that_do_not_exist = set(dict2.keys()) - set(dict1.keys())
      

      【讨论】:

      • 我不确切知道 OP 要求什么,但不可能是这样。他的两个字典有完全相同的键,所以这总是一个空集。另外,他正在尝试将dict2 写入 CSV 文件,因此仅写入新标题(如果有的话)不会有任何用处。
      • 是的,我认为你更接近 OP 想要的......我认为我不太理解这个问题......
      • 我不确定里面是否有足够的内容来很好地理解这个问题……我假设他在问 something 与 CSV 文件有关的明智问题,并且可能与DictWriter... 但很难比这更远。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-01-25
      • 1970-01-01
      • 2012-11-08
      • 2016-09-05
      • 1970-01-01
      • 1970-01-01
      • 2021-03-21
      相关资源
      最近更新 更多