【问题标题】:argparse - group unknown fields in csvargparse - 在 csv 中对未知字段进行分组
【发布时间】:2015-02-18 19:41:02
【问题描述】:

我正在进行 csv 到 json 的转换,一切正常,问题是我的最后一个字段有时有逗号分隔值,解析器将其视为新列。

即:

key1 key2 key3 key4
val1 val2 val3 val4,val4.1,val4.2,val4.3

我得到了这种json:

{key1: val1, key2: val2, key3:val3, key4:val4} 

而且 val4.1,val4.2,val4.3 不存在。 适当的结果是:

{key1: "val1", key2: "val2", key3: "val3", key4: "val4,val4.1,val4.2,val4.3"} 

到目前为止我的代码:

#!/usr/bin/env python
"""Convert csv to json"""
import json
import argparse

def parse(filename):
    with open(filename) as f:
        csv = f.read().split('\r\n\r\n')[1]

    keys = ['val1', 'val2', 'val3', 'val4']
    for line in stations.split('\r\n')[1:]:
        yield dict(zip(keys, [cell.strip() for cell in line.split(',')]))


if __name__ == '__main__':
    parser = argparse.ArgumentParser(description=__doc__)
    parser.add_argument('-i', default='dump.csv', help='csv input file')
    parser.add_argument('-o', default='state/dump.json', help='json output file')
    (opt, args) = parser.parse_args()

    with open(opt.o, 'w+') as f:
        rows = []
        for row in parse(opt.i):
            rows.append(row)
        json.dump(rows, f, ensure_ascii=False)

【问题讨论】:

  • 呃!解析格式不正确的输入总是很难看的。您说输入是 CSV 的问题,但您的输入是“val1 val2 val3 val4,val4.1,val4.2,val4.3”。那不是 CSV,而是“空格分隔值”。如果是这样,您可以使用line.split(' ')
  • 您可以在 SO 中回答您自己的问题 :)
  • 请将您的解决方案拆分为一个答案,以便我们独立投票。
  • 标题和标签中的 argparse 会分散注意力,应该删除。

标签: python json csv argparse


【解决方案1】:

解决方案

答案其实很简单,只是漫长的一天,所以我没有马上想到。 寻求者的解决方案是这样的:

  1. 计算当前行中有多少项比键多。
  2. 将所有附加内容放在一个字符串中
  3. 用新字符串替换单个“val4”。

代码:

keys = ['val1', 'val2', 'val3', 'val4']
for line in csv.split('\r\n')[1:]:
    current_line = line.split(',')
    extras = len(current_line) - len(keys)
    newString = ""
    for i in range(len(keys), len(keys) + extras):
        if(i+1 == len(keys) + extras):
            newString += current_line[i]
        else:
            newString += current_line[i] + ","

    list = line.split(',')
    list[len(keys)-1] = probes
    yield dict(zip(keys, [cell.strip() for cell in list]))

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-06-15
    • 2014-09-23
    • 1970-01-01
    • 2011-01-15
    • 1970-01-01
    • 2013-10-06
    • 1970-01-01
    相关资源
    最近更新 更多