解析CSV文件时更新字典

时间:2012-03-16 08:44:20

标签: python csv

我有这样的csv文件:

item,#RGB
item1,#ffcc00
item1,#ffcc00
item1,#ff00cc
item2,#00ffcc
item2,#ffcc00
item2,#ffcc00
item2,#ffcc00
....

我想创建字典d,项目名称为键和RGB值,并将列表中的元组计为字典值,如:

d[item] = [ (#RGB, count) ]

所以对于“item1”,例如,我想得到:

d['item1'] = [ ('#ffcc00', 2), ('#ff00cc', 1) ]

我想一些Pythonic迭代器可以在一行中做到这一点,但我现在无法理解。到目前为止,我已经做到了这一点:

d={}
with open('data.csv', 'rb') as f:
    reader = csv.reader(f)
    try:
        for row in reader:
            try:
                if d[(row[0], row[1])]:
                    i +=1
            except KeyError:
                i = 1
            d[(row[0], row[1])] = i
    except csv.Error, e:
        sys.exit('file %s, line %d: %s' % (filename, reader.line_num, e))

给了我:

d[(item, #RGB)] = count

有更好的方法吗?或者我从一开始就做错了吗?

2 个答案:

答案 0 :(得分:2)

怎么样:

a = {}

for row in reader:
    a.setdefault(row[0], {}).setdefault(row[1], 0)
    a[row[0]][row[1]] += 1

这会创建一个像

这样的字典
 {'item2': {'#00ffcc': 1, '#ffcc00': 3}, 
  'item1': {'#ffcc00': 2, '#ff00cc': 1}}

我发现它比你的结构更方便,但你可以根据需要将其转换为元组:

 b = dict((k, v.items()) for k, v in a.items())

答案 1 :(得分:0)

import csv
from collections import defaultdict, Counter
from itertools import islice

with open('infile.txt') as f:
    d=defaultdict(Counter)
    for k,v in islice(csv.reader(f),1,None):
        d[k].update((v,))

print d

打印

defaultdict(<class 'collections.Counter'>, {'item2': Counter({'#ffcc00': 3, '#00ffcc': 1}), 'item1': Counter({'#ffcc00': 2, '#ff00cc': 1})})