我正在尝试编写将值附加到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' )
答案 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)