将CSV文件的内容转换为字典

7
我目前的代码是一个函数,基本上是读取一个csv文件并打印其内容:
def read(filename):
    with open(filename, 'r') as csvfile:
        reader = csv.reader(csvfile, delimiter=',')
        for row in reader:
            print(row)
< p > < code > sailor.csv 的内容如下:

name, mean performance , std dev
Alice, 100, 0,
Bob, 100, 5,
Clare, 100, 10,
Dennis, 90, 0,
Eva, 90, 5,

read('sailor.csv')并运行该函数

当前输出:

['name', ' mean performance ', ' std dev']
['Alice', ' 100', ' 0', '']
['Bob', ' 100', ' 5', '']
['Clare', ' 100', ' 10', '']
['Dennis', ' 90', ' 0', '']
['Eva', ' 90', ' 5', '']

所需输出:

{'Dennis': (90.0, 0.0), 'Clare':(100.0, 10.0), 
'Eva': (90.0, 5.0), 'Bob': (100.0, 5.0), 'Alice': (100.0, 0.0)}

有什么方法可以实现这种输出?使用Python 3.4.2,如果有帮助的话,欢迎对您的回答进行解释!

5个回答

8
使用 csv 标准库和字典推导式...
import csv
with open('sailor.csv') as csvfile:
   reader = csv.reader(csvfile)
   next(reader)
   d = {r[0] : tuple(r[1:-1]) for r in reader}

如果你想要的是一个字典,d 将会是你需要的。 d[1:-1] 从第二个元素开始到倒数第二个元素进行切片。

编辑:跳过头部,转换为元组


第一行怎么样:['姓名','平均表现','标准差']? - Marcin
这很接近了,但我认为数字应该是元组?像这样:'Eva': (90.0, 5.0),而不是'Eva': [90.0, 5.0]。并且 'name': [' mean performance '] 也被打印出来。 - Alex

2
我想这是你想要的内容:

我认为这是你想要的:

import csv

def read(filename):
    out_dict = {}
    with open(filename, 'r') as csvfile:
        reader = csv.reader(csvfile, delimiter=',')
        next(csvfile) # skip the first row
        for row in reader:
            out_dict[row[0]] = float(row[1]), float(row[2])
            print(row)

    return out_dict

print(read('data.csv'))   

输出:

{'Bob': (' 100', ' 5'), 'Clare': (' 100', ' 10'), 'Alice': (' 100', ' 0'), 'Dennis': (' 90', ' 0'), 'Eva': (' 90', ' 5')}

这里没有太多需要解释的。只需将值放入字典中并跳过添加的第一行。我假设人名是唯一的。


他需要浮点数作为输出;或者只是添加了“.0”。而且数字周围没有引号。 - Marichyasana
我稍微调整了一下,加上了float在row[1]和row[2]之前,修正了数字..现在它完美地工作了!谢谢!也不需要使用print,因为我稍后会调用该函数..read('sailor.csv')对我来说很有效! - Alex
@Alex 提醒一下,如果你提出编辑建议,应该提供更详细的描述,说明你为什么进行了编辑(而不是你编辑了什么)...在“建议编辑”审查中,你看不到评论,只能看到带有更改的帖子和你提供的原因;请参阅此元帖 ...你也不应该更改你的问题以包含已接受的答案;你需要点击“接受”来做到这一点,这样可以保持问题的“清洁”,方便未来遇到类似问题的人。 - Martin Tournoij

2
所以……我知道这个问题大部分已经得到了回答,但是我想加上一句话来补充缩短的答案:
from csv import reader
from itertools import islice

{r[0] : tuple(r[1:-1]) for r in islice(reader(open('sailor.csv')), 1, None)}

唯一真正新颖的是将islice添加到代码中,可以清晰地跳过标题行。

你错过的一件事情是将数字变成浮点数,除此之外很好 :) - Alex

0

使用 DictReader:

def read(filename):
    with open(filename, 'r') as csvfile:
        reader = csv.DictReader(csvfile, delimiter=',')
        for row in reader:
            print(row)

1
每一行不是都会变成 {"header1" : val1, "header2" : val2,...} 这样的字典形式,而不是上面展示的元组/列表形式吗? - Ben Southgate

0

如果可以的话,这是我的解决方案:

>>> import pyexcel as pe
>>> s = pe.load("sailor.csv", name_rows_by_column=0, name_columns_by_row=0)
>>> s.format(float)
>>> s
Sheet Name: csv
+--------+------------------+---------+---+
|        | mean performance | std dev |   |
+========+==================+=========+===+
| Alice  | 100              | 0       | 0 |
+--------+------------------+---------+---+
| Bob    | 100              | 5       | 0 |
+--------+------------------+---------+---+
| Clare  | 100              | 10      | 0 |
+--------+------------------+---------+---+
| Dennis | 90               | 0       | 0 |
+--------+------------------+---------+---+
| Eva    | 90               | 5       | 0 |
+--------+------------------+---------+---+
>>> del s.column[''] # delete the column which has '' as its name
>>> s.to_dict(True) # make a dictionary using row names as key
OrderedDict([('Alice', [100.0, 0.0]), ('Bob', [100.0, 5.0]), 
('Clare', [100.0, 10.0]), ('Dennis', [90.0, 0.0]), ('Eva', [90.0, 5.0])])

这里是关于 pyexcel 的 pe.loadto_dict 的文档


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