Python将CSV转换为按列排列的字典

3

能否从csv文件中读取数据到一个字典中,使得每一列的第一行作为键(key),而该列剩余的行作为值(value)保存为列表?

例如,有一个csv文件:

     strings, numbers, colors 
     string1, 1, blue
     string2, 2, red
     string3, 3, green
     string4, 4, yellow

使用

with open(file,'rU') as f: 
    reader = csv.DictReader(f)
    for row in reader:
        print row

我获得

{'color': 'blue', 'string': 'string1', 'number': '1'}
{'color': 'red', 'string': 'string2', 'number': '2'}
{'color': 'green', 'string': 'string3', 'number': '3'}
{'color': 'yellow', 'string': 'string4', 'number': '4'}

或者使用
 with open(file,'rU') as f: 
        reader = csv.reader(f)
        mydict = {rows[0]:rows[1:] for rows in reader}
        print(mydict)

我获得了以下字典
{'string3': ['3', 'green'], 'string4': ['4', 'yellow'], 'string2': ['2', 'red'], 'string': ['number', 'color'], 'string1': ['1', 'blue']}

然而,我希望获得...
{'strings': ['string1', 'string2', 'string3', 'string4'], 'numbers': [1, 2, 3,4], 'colors': ['red', 'blue', 'green', 'yellow']}

不,该帖子的每一行都有独特的键值对。 - undefined
csv.DictReader 可能不是最好的选择 - 如果你按照上面的问题并稍微尝试一下 - 你应该能得到答案。例如,你可以将 row[0] 收集为键,将其他所有内容收集为值 rows[1:]。现在试试看吧。 - undefined
我已经尝试了几个小时,但也许我描述问题不够清楚。我想要做的是将col[0]作为键,col[1:]作为值进行收集。但是我无法循环遍历读取器对象的列,只能遍历行。这就是我正在努力解决的问题。 - undefined
3个回答

8
你需要解析第一行,创建列,然后继续处理其余的行。
例如:
columns = []
with open(file,'rU') as f: 
    reader = csv.reader(f)
    for row in reader:
        if columns:
            for i, value in enumerate(row):
                columns[i].append(value)
        else:
            # first row
            columns = [[value] for value in row]
# you now have a column-major 2D array of your file.
as_dict = {c[0] : c[1:] for c in columns}
print(as_dict)

输出:

{
    ' numbers': [' 1', ' 2', ' 3', ' 4'], 
    ' colors ': [' blue', ' red', ' green', ' yellow'],
    'strings': ['string1', 'string2', 'string3', 'string4']
}

(您输入的“文件”中有一些奇怪的空格。在逗号之前/之后删除空格,或者如果它们在您的实际输入中,请使用value.strip()。)

4
这就是为什么我们需要defaultdict
from collections import defaultdict
from csv import DictReader

columnwise_table = defaultdict(list)
with open(file, 'rU') as f:
    reader = DictReader(f)
    for row in reader:
        for col, dat in row.items():
            columnwise_table[col].append(dat)
print columnwise_table

感谢您的编辑。当我完成利用默认行为后,我的习惯是将defaultdict替换为dict,原始编写的代码并没有完全做到这一点,所以简单明了更好。 - undefined
嗨Peter,使用CSV文件实现相同的结果有什么方法呢?我的意思是将多列的CSV文件打开并转换为字典。 - undefined

0

是的,这是可能的:试试这种方法:

import csv
from collections import defaultdict

D=defaultdict(list)
csvfile=open('filename.csv')
reader= csv.DictReader(csvfile)  # Dictreader uses the first row as dictionary keys
for l in reader:                 # each row is in the form {k1 : v1, ... kn : vn}
    for k,v in l.items():  
        D[k].append(v)       
...................
...................

假设 filename.csv 包含一些数据

strings,numbers,colors 
string1,1,blue
string2,2,red
string3,3,green
string4,4,yellow

然后 D 将会得到

defaultdict(<class 'list'>, 
            {'numbers': ['1', '2', '3', '4'], 
             'strings': ['string1', 'string2', 'string3', 'string4'], 
             'colors':  ['blue', 'red', 'green', 'yellow']})

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接