csv.DictReader文件csv字段中带有多个引号的分隔符

2024-04-26 23:40:48 发布

您现在位置:Python中文网/ 问答频道 /正文

下面是我阅读的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列在所有情况下都为空。 在“reader”中,有多个条目具有相同的“name”和“id”,我正在“合并”,但在像最后四行(1A,2B)中,我遇到了一个问题,因为描述中有“;”分隔符。你知道吗

即使使用quotechar='''''和引号=csv.QUOTE\u全部description列被分隔符抛出,并转到下一列(uuid)和一个“None”列,该列会破坏我的数据。你知道吗

你知道怎么解决这个问题吗?你知道吗

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

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

提前多谢了!你知道吗


Tags: csvkeytextnameinnoneforindex