【问题标题】:Converting the contents of a CSV file into a dictionary将 CSV 文件的内容转换为字典
【发布时间】:2015-02-08 04:25:49
【问题描述】:

到目前为止,我的代码在一个函数中,该函数基本上读取一个 csv 文件并打印它的内容:

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

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,我们将不胜感激!

【问题讨论】:

    标签: python function csv dictionary


    【解决方案1】:

    使用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] 将数组从第二个到倒数第二个元素切片。

    编辑:跳过标题,转换为元组

    【讨论】:

    • 第一行呢:['name', ' mean performance ', ' std dev']?
    • 这很接近,但我认为这些数字应该是元组?像这样:'Eva': (90.0, 5.0) 不是'Eva': [90.0, 5.0]。并且 'name': [' mean performance '] 也被打印出来了
    【解决方案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”。并且数字周围没有引号。
    • 我稍微调整了一下,在 row[1] 和 row[2] 之前添加浮点数固定了数字.. 现在它工作得很好!谢谢! - 也不需要使用 print,因为我稍后会调用该函数.. read('sailor.csv') 对我有用!
    • @Alex FYI,如果您提出编辑建议,您应该提供更详细的说明为什么您进行了编辑(而不是 what您编辑过)...您不会在 Suggested Edits 评论中看到 cmets;只有有更改的帖子,以及您提供的原因; see this meta post ...您也不应该更改您的问题以包含已接受的答案;你点击一个问题上的“接受”来做到这一点,这可以让未来有类似问题的人在这里结束这个问题。
    【解决方案3】:

    所以...我知道这个问题大部分已经得到解答,但我想我只是在混合中添加一个单行符以添加到缩短的答案中:

    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 以干净地跳过标题行。

    【讨论】:

    • 你错过的一件事是让数字浮动,而不是很好:)
    【解决方案4】:

    使用 DictReader:

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

    【讨论】:

    • 每一行不会是{"header1" : val1, "header2" : val2,...} 而不是如上所示的元组/列表吗?
    【解决方案5】:

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

    >>> 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 的文档

    【讨论】:

      猜你喜欢
      • 2017-03-27
      • 2016-01-28
      • 2017-06-01
      • 2021-12-22
      • 2017-09-13
      • 2014-03-01
      • 2020-12-24
      • 2019-02-01
      • 1970-01-01
      相关资源
      最近更新 更多