具有多引号的csv字段内的csv.DictReader分隔符

时间:2018-11-27 08:00:22

标签: python python-2.7 csv

我有以下示例csv,正在阅读:

f = StringIO(response.encode('utf-8'))
reader = csv.DictReader(f, quotechar='"', delimiter=';', quoting=csv.QUOTE_ALL, skipinitialspace=True)

csv示例:

id;name;community;owner;owns;description;uuid
3c;NP;NoProb;NoP;Text;text_with_no_issues;
3c;NP;NoProb;NoP;TextText;text_with_no_issues2;
1A;fooo;barr;Bar;TEXT1;"\"text\"\"None\"\";text\"\"TEXT\"\"text\"";
1A;fooo;barr;Bar;TEXT2;"\"text\"\"None\"\";text\"\"TEXT\"\"text\"";
2B;BAR;foo;Bar;TEXT3;"\"text\"\"None\"\";text\"\"TEXT\"\"text\";text\"\"TEXT\"\"text\"";
2B;BAR;foo;Bar;TEXT4;"\"text\"\"None\"\";text\"\"TEXT\"\"text\";text\"\"TEXT\"\"text\"";

在所有情况下,uuid列均为空。 在“阅读器”中,有多个我正在“合并”的具有相同“名称”和“ id”的条目,但是在最后四个(1A,2B)之类的行中,我因为“;”而遇到问题说明中的定界符。

即使使用quotechar ='“'和quoting = csv.QUOTE_ALL,描述列也会被定界符分隔,并转到下一个列(uuid)和“无”列,这会破坏我的数据。

有什么办法解决这个问题吗?

P.S。对于合并逻辑,我使用了两种变体:

##############################################################
    name_index = []
    result = []
    for line in reader:
        idx = line["name"]
        if idx not in name_index:
            name_index.append(idx)
            result.append(line)
        else:
            idx_curr_dict = result[name_index.index(idx)]
            merge_entries = [idx_curr_dict, line]
            placeholder = {}
            for key in idx_curr_dict:
                placeholder[key] = ", ".join(list(set(d[key] for d in merge_entries if d[key] != "" and d[key])))
            result[name_index.index(idx)] = placeholder
##############################################################

慢一点,但并不复杂:

##############################################################
    data = [line for line in reply]  # Deplete the iterator
    unique_names = set([line['name'] for line in data])  # List of unique names
    column_names = [key for key in data[0] if key != 'name' and key != 'uuid']  # all other useful columns
    result = []
    for name in unique_names:
        same_named_lines = [line for line in data if line['name'] == name]
        unique_line = {'name': name}
        for column in column_names:
            value = ", ".join(set([line[column] for line in same_named_lines]))
            unique_line[column] = value
        result.append(unique_line)
##############################################################

非常感谢!

0 个答案:

没有答案