从CSV文件创建字典,字典不包含所有值

时间:2016-07-18 20:05:58

标签: python csv dictionary

对于以下CSV文件:

A,B,C
-----
A1,B1,C1
A1,B2,C2
A2,B3,C3
A2,B4,C4

我的词典目前看起来像这样:

{'A1': {'B':'B1', 'C':'C1'}, 'A2': {'B':'B3', 'C':'C3'}

如何让我的字典看起来像这样:

'A1': {'B': ['B1', 'B2'], 'C': ['C1', 'C2']}, 'A2': {'B': ['B3', 'B4'], 'C': ['C3', 'C4']}}

我目前正在使用以下代码:

import csv
reader = csv.DictReader(open('test.csv'))

result = {}
for row in reader:
    key = row.pop('A')
    if key in result: pass
    result[key] = row
print result

3 个答案:

答案 0 :(得分:0)

您需要为每个键创建一个基本案例,以便字典将第一个值作为列表插入。然后,您可以在遇到重复键时附加值。

以下代码应该满足您的需求:

with open('test.csv') as f:
    reader = csv.DictReader(f)

    for row in reader:
            key = row.pop('A')
            if '-' in key:
                    continue
            if key not in result:
                    new_row = {'B': [row.pop('B')], 'C': [row.pop('C')]}
                    result[key] = new_row
            else:
                    result[key]['B'].append(row.pop('B'))
                    result[key]['C'].append(row.pop('C'))

答案 1 :(得分:0)

您不必使用DictReader来实现此目的。你可以使用常规的csv.reader并填写你自己的字典。

这是一个评论的简单解决方案:

from __future__ import print_function
import csv

csv_fpath = 'test.csv'
# readcsv.py

# You want this:
#{'A1': {'B':['B1','B2'], 'C':['C1','C2']}, 'A2': {'B':['B3','B4'], ..}}
mydict = {}
# newline = '' option is needed as per csv.reader documentation python 3.x
with open(csv_fpath, mode='r') as csvfile:
    # A regular csv reader object
    myreader = csv.reader(csvfile, delimiter=',')

    # Header on first line
    hrow = next(myreader)
    # # Tagging header names for dictionary keys later
    taga, tagb, tagc = hrow[0], hrow[1], hrow[2]

    # Skip separator line (delete this line if unnecessary)
    next(myreader)

    # Reading data and constructing our dictionary
    for row in myreader:
        if len(row) == 0:
            # ignore blank lines
            continue
        # Each row's key is the first column value
        key = row[0]
        if key in mydict:
            # If an item exists with the given key, that item itself is also a
            # dictionary with lists in keys tagb and tagc. So we append to those
            # lists the values in second and third columns
            mydict[key][tagb].append(row[1])
            mydict[key][tagc].append(row[2])
        else:
            # Note the list constructors, they are important as we are going to
            # append them down the iteration
            mydict[key] = { tagb: [row[1]]
                          , tagc: [row[2]]}

print(mydict)

答案 2 :(得分:0)

略有不同的方法:

reader = csv.DictReader(open("test.csv"))

result = {}
for row in reader:
    if reader.line_num <= 2:
        continue
    key = row["A"]
    for subkey in [k for k in row.keys() if k != "A"]:
        if key not in result:
            result[key] = {}
        if subkey not in result[key]:
            result[key][subkey] = []
        result[key][subkey].append(row[subkey])

>>> print(result)
{'A2': {'C': ['C3', 'C4'], 'B': ['B3', 'B4']}, 'A1': {'C': ['C1', 'C2'], 'B': ['B1', 'B2']}}