首页 > 解决方案 > csv.DictReader 分隔符在带有多个引号的 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) 和损坏我的数据的“无”列。

知道如何解决这个问题吗?

PS 对于合并逻辑,我使用了两种变体:

##############################################################
    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)
##############################################################

提前非常感谢!

标签: pythonpython-2.7csv

解决方案


推荐阅读