如何在缺少的csv字段中插入默认值?

时间:2016-01-13 21:32:16

标签: python csv row reader

我正在尝试编写将值附加到csv。我可以搜索并找到缺少字段的位置,但想知道是否有办法插入0作为这些字段的默认值。

我有以下代码。

def fillBlanks():

    HEADERS =  ['ST','Year','PCT_SHORT','PCT_V_SHORT','Year','PCT_SHORT',
                'PCT_V_SHORT','Year','PCT_SHORT','PCT_V_SHORT' ]
    fileH = open(outputDir+"PCT_SHORT_V_SHORT.csv", 'rb')
    reader = csv.DictReader(fileH, HEADERS)

    for row in reader:
        if any(row[key] in (None, "") for key in row):
           print "bad"+ str(row)

    fileH.close()

这为我提供了缺失的行和列,如下所示。

bad{'PCT_SHORT': None, 'Year': None, 'PCT_V_SHORT': None, 'ST': 'NV'}
bad{'PCT_SHORT': None, 'Year': None, 'PCT_V_SHORT': None, 'ST': 'CA'}
bad{'PCT_SHORT': None, 'Year': None, 'PCT_V_SHORT': None, 'ST': 'AZ'}
bad{'PCT_SHORT': None, 'Year': None, 'PCT_V_SHORT': None, 'ST': 'US'}

有没有办法在默认值中进行编码,因此不会丢失任何字段?我想把字段设置为999或0.我希望这很清楚,我是python的新手。

编辑: 这是一个数据样本     ('OK','2015','14','3','2014','28','17','2013','19','17','2012','36',' 12' )     ('AZ','2015','14','2','2014','36','2')     ('ID','2015','12','0','2014','28','4','2013','24','2','2012','14',' 1' )

1 个答案:

答案 0 :(得分:2)

DictReader有一个restval参数来设置缺失字段的默认值。

但是对于缺失的字段......在读取值的末尾,即:该行的字段少于预期。

您的问题中不清楚您的遗失字段是否在链的末尾或任何位置。或者,如果缺失表示将有两个连续的分隔符。

此外,DictReader可能不是您最好的朋友:HEADERS定义中的某些字段具有相同的名称,因此会写入相同的密钥。如果这不是你的意图,你应该为每个标题分配一个唯一的名称。

编辑:发表评论

下面代码中的标题为每个csv字段提供唯一ID,缺少的字段将使用传递的值missing'0'填充。

有了它,DictReader可以将每个读取的csv字段分配给各个键,或者使用restval填写。

A DictWriter撤消操作并使用已解析(可能已填充)的csv数据写回outpath

def fillBlanks(inpath, outpath, missing=None, writeheaders=False):
    # Assign unique identifiers in HEADERS to each csv field
    HEADERS = [
        'ST',
        'Year_1', 'PCT_SHORT_1', 'PCT_V_SHORT_1',
        'Year_2', 'PCT_SHORT_2', 'PCT_V_SHORT_2',
        'Year_3', 'PCT_SHORT_3', 'PCT_V_SHORT_3'
    ]

    # Open and parse file with default value for missing
    rfile = open(inpath, 'r')
    reader = csv.DictReader(rfile, fieldnames=HEADERS, restval=missing or '0')

    # Open and write to file with writer
    wfile = open(outpath, 'w')
    writer = csv.DictWriter(wfile, fieldnames=HEADERS)

    if writeheaders:
        writer.writeheaders()

    # Write each row from reader to writer
    for row in reader:
        writer.writerow(row)