将文件解析为数组字典

时间:2015-10-28 21:01:39

标签: python file parsing dictionary

我有一个包含设备数据行的csv文件,如下所示:

#file.csv
devA,x1,y1
devB,x1,y1
devA,x2,y2
devC,x1,y1
devC,x2,y2
devA,x3,y3

我想创建一个使用键的设备名称生成数据点数组的字典:

{
    'devA':[
            [x1,y1],[x2,y2],[x3,y3]
         ],
    'devB':[
            [x1,y1]
         ],
    'devC':[
            [x1,y1],[x2,y2]
         ]
}

我尝试了以下内容:

#!/usr/bin/python
#dict.py
import csv,datetime

with open('file.dat', 'rb') as csvfile:
    dataReader=csv.reader(csvfile)
    book={row[0]:[row[1],row[2]] for row in dataReader}
print book

但输出

$ ./dict.py 
{'devC': ['x6', 'y6'], 'devB': ['x2', 'y2'], 'devA': ['x7', 'y7']}

我想我发现问题是我的book=行正在替换每个键的内容而不是追加。我怎样才能以“Python”方式获得所需的结果?

2 个答案:

答案 0 :(得分:2)

您可以使用dict.setdefault方法创建预期字典:

my_dict={}
with open('file.dat', 'rb') as csvfile:
    dataReader=csv.reader(csvfile)
    for name,item1,item2 in dataReader:
         my_dict.setdefault(name,[]).append([item1,item2])

如果你使用的是python 3.X,你可以在你的循环中使用解压缩协议:

for name,*items in dataReader:
    my_dict.setdefault(name,[]).append(items)

答案 1 :(得分:1)

您可以使用collections.defaultdict:

import collections
with open("your_file") as f:
    my_dict = collections.defaultdict(list)
    for line in f:
        line = line.split(",")
        my_dict[line[0]].append(line[1:])