python - 如何将默认值插入缺失的 csv 字段?

标签 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 新手。

编辑: 这是数据示例 ('好的', '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')

最佳答案

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

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

您的问题不清楚您丢失的字段是位于链的末尾还是链中的任何位置。或者如果缺失意味着将有两个连续的分隔符。

此外,DictReader 可能不是您最好的 friend :HEADERS 定义中的某些字段具有相同的名称,因此将写入相同的键。如果这不是您的意图,您应该为每个 header 分配一个唯一的名称。

编辑:按照评论

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

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

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)

关于python - 如何将默认值插入缺失的 csv 字段?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34777438/

相关文章:

javascript - NodeJS 创建 CSV 直接写入 Google Storage

java - 如何在表格布局中应用行跨度?

sqlite - 从 sqlite 表中选择随机行

python - 时间格式正则表达式 HH :MM AM/am/PM/pm in python

python - 如何将工作表复制到另一个工作表(而不是作为附加工作表)

python - 从单列中删除异常值

php - 如何从 csv 字符串创建数组?

python - 如何在 Pandas 数据框中显示汉字?

python - 多进程写入python中的一个管道

python - 从其他 numpy 数组创建 numpy 数组