【问题标题】:How to Create proper CSV using Dict Writer in python?如何在 python 中使用 Dict Writer 创建正确的 CSV?
【发布时间】:2018-04-14 08:52:12
【问题描述】:

我想将不同的列及其值写入单个 CSV 文件, 但它覆盖了前面的行。我的代码是,

import csv
onlyKeys=['date']
def samp(date,field):
    onlyKeys.append(field)
    myFile = open('fulltest.csv', 'wb') 
    with myFile: 
        writer1 = csv.DictWriter(myFile, fieldnames=onlyKeys)    
        writer1.writeheader()     

        writer1.writerow({'date' : date, field: 1})  
        print('row written') 
    myFile.close()
samp('jan 10 2018 23:34:55','Video Error1')     
samp('jan 10 2018 23:34:56','Video Error2')   
samp('jan 10 2018 23:34:57','Video Error3')

我的预期输出是

date,Video Error1,Video Error2,Video Error3
jan 10 2018 23:34:55,1,0,0
jan 10 2018 23:34:56,0,1,0
jan 10 2018 23:34:57,0,0,1

但我得到的是,

date,Video Error1,Video Error2,Video Error3
jan 10 2018 23:34:57,,,1

如何将每一行写在单独的行上。谢谢

【问题讨论】:

    标签: python python-2.7 csv dictionary


    【解决方案1】:

    'wb' 模式打开文件首先要销毁文件中的所有数据。您想要追加新数据到现有数据,因此您应该以'ab' 模式打开文件。顺便说一句,我认为 DictReader/DictWriter 不需要二进制文件。所以你可以简单地使用模式'a'

    为避免出现多个标题行,writeheader() 命令也应移到samp 函数之外。但这意味着您在开始调用函数samp之前知道所有字段的总数和名称

    最后说明:当您在 CSV 文件中写入一行时,您只会输出两个字段:date 和当前的field。因此,您无法在未使用的字段中获得 0(如您预期的输出中给出的那样),而是在空字段中获得。但是我想这应该是您其余处理的问题

    【讨论】:

    • 但是文件模式'ab'每次都附加标题(列),'date'在我的情况下只是常量标题,其他标题可能会动态变化。其他标题将是(视频错误 1、视频错误 2 等)
    • 是的,你只需要在第一次调用函数samp之前写一次header。我编辑我的答案以反映此信息。
    猜你喜欢
    • 1970-01-01
    • 2017-03-06
    • 2020-03-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-17
    • 1970-01-01
    • 2018-11-06
    • 1970-01-01
    相关资源
    最近更新 更多