将字典结果追加到Python中的CSV文件中

8

我想将一个字典附加到已经有标题行的CSV文件中,如果值不存在,我希望写入'-999'

SDict ={T1:'A',T2:'B',T4:'D')

CSV文件中的标题为

T1,T2,T3,T4,T5
7,8,9,10,11

预期结果为:
T1,T2,T3,T4,T5
7,8,9,10,11
A,B,-999,D,-999

我正在尝试使用以下代码完成此操作:
import sys
import os
import csv

def GetFileHeader(Fpath):
    i=10
    ResFile=open (Fpath, 'r+')
    HeaderDict={}
    r=csv.reader(ResFile)
    HeaderList = r.next()
    for Header in HeaderList:
        HeaderDict[Header]=i+1
    print HeaderDict
    ResFile.close()
    return HeaderDict


Fpath= r'Z:\temp\assaf\S2TTP\S2T_TP\modules\results\Y124\res.csv'

Header= GetFileHeader(Fpath)

with open(Fpath,'rb') as fin:
    dr = csv.DictReader(fin, dialect='excel')
    print dr
    print dr.fieldnames
# dr.fieldnames contains values from first row of `f`.
with open(Fpath,'ab+') as fou:
    dw = csv.DictWriter(fou, dialect='excel', fieldnames=dr.fieldnames)
    fieldnames=dr.fieldnames
    for K in fieldnames:
        dw.writerow(Header[k])
1个回答

5

我认为你可以简单地这么做:

import csv

SDict = {'T1': 'A', 'T2': 'B', 'T4': 'D'}

with open('file.csv', 'r+b') as f:
    header = next(csv.reader(f))
    dict_writer = csv.DictWriter(f, header, -999)
    dict_writer.writerow(SDict)

假设您在使用 Python 2.X 版本。另外,请注意那些没有以换行符结尾的文件,否则您可能会得到这样一行数据:7,8,9,10,11A,B,-999,D,-999

1
谢谢! 另一个相关的问题: 如果CSV文件中已经存在标题行,那么在更新结果并添加新列时是否可以追加标题行呢? 假设我想在第4行添加T6到标题中。 - Assaf Baker
1
@user2740068:是的,每一行都是独立的,所以如果你想要这样做,比如添加T6到表头,你可以执行header.append('T6'),然后再次执行dict_writer = csv.DictWriter(f, header, -999)来使用新的表头。 - user2379410
1
我的标题是字典,有没有办法比较这两个标题并附加差异?请记住,这是一个结果文件,其中标题为“测试”,其他每一行均为结果。我不希望我的标题(测试名称)更改位置,因此其他结果将显示不正确。 - Assaf Baker
1
@user2740068,您能详细解释一下您想要什么吗?您是想在整个文件中只有一个标题还是多个标题?另外,您有多少个不同的带结果的字典? - user2379410
1
我正在运行一个单元测试程序,该程序将结果收集到字典中。 第一个单元根据运行的测试创建CSV结果文件和标题。 现在我运行第二个单元,并希望在第一个单元下添加结果行,但对于第二个单元,我有一些需要附加的额外测试。 结果文件应该为所有单元提供一个标题。 字典编写器保证每个测试结果都会一个接一个地排列,对于附加测试,只有第二个单元会有结果。 可以通过读取标题并比较循环字典键来完成,但我认为应该有更简单的方法。 - Assaf Baker
@user2740068,可以通过在循环中比较键来完成。或者您可以使用一个集合,例如:header.extend(set(other_header).difference(header)),其中other_header是第二个单元的标题。但如果您需要更多帮助,请提出一个新问题 :) - user2379410

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接