将 CSV 值读入列表字典的最 Pythonic 方法

2023-11-24

我有一个 CSV 文件,其数据列顶部的标题如下:

a,b,c
1,2,3
4,5,6
7,8,9

我需要在列表字典中阅读它:

desired_result = {'a': [1, 4, 7], 'b': [2, 5, 8], 'c': [3, 6, 9]}

当阅读本文时DictReader我正在使用嵌套循环将项目附加到列表中:

f = 'path_to_some_csv_file.csv'
dr = csv.DictReader(open(f))
dict_of_lists = dr.next()
for k in dict_of_lists.keys():
    dict_of_lists[k] = [dict_of_lists[k]]
for line in dr:
    for k in dict_of_lists.keys():
        dict_of_lists[k].append(line[k])

第一个循环将字典中的所有值设置为空列表。下一个循环遍历从 CSV 文件读取的每一行,其中DictReader创建一个键值字典。内部循环将值附加到与相应键匹配的列表中,因此我最终得到了所需的字典列表。我最终不得不经常写这个。

我的问题是,是否有一种更 Pythonic 的方法来使用内置函数而不使用嵌套循环,或者更好的习惯用法,或者存储此数据结构的替代方法,以便我可以通过使用键查询来返回可索引列表?如果是这样,是否还有一种方法可以预先格式化列所摄取的数据?


根据您存储的数据类型以及如果您可以使用 numpy,执行此操作的一个好方法是numpy.genfromtxt:

import numpy as np
data = np.genfromtxt('data.csv', delimiter=',', names=True)

这将创建一个 numpy结构化数组,它提供了一个很好的接口,用于通过标头名称查询数据(请确保使用names=True如果您有标题行)。

给定示例data.csv包含:

a,b,c
1,2,3
4,5,6
7,8,9

然后您可以使用以下方式访问元素:

>>> data['a']        # Column with header 'a'
array([ 1.,  4.,  7.])
>>> data[0]          # First row
(1.0, 2.0, 3.0)
>>> data['c'][2]     # Specific element
9.0
>>> data[['a', 'c']] # Two columns
array([(1.0, 3.0), (4.0, 6.0), (7.0, 9.0)],
      dtype=[('a', '<f8'), ('c', '<f8')])

genfromtext根据您的要求,还提供了一种“格式化由列预先摄取的数据”的方法。

转换器 : 变量,可选

将列数据转换为值的函数集。转换器还可以用于为丢失的数据提供默认值:converters = {3: lambda s: float(s or 0)}.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

将 CSV 值读入列表字典的最 Pythonic 方法 的相关文章

随机推荐