因此,我编写了这段代码,其目的是读取CSV文件并将数据写入带有键"key1""key2""key3""key4"的字典,这些键的值以列表的形式给出,该列表由CSV文件的列中的数据组成,但进行了一些修改:

import numpy as np
import csv
#code
...
#code       
 with open(file,'r') as fl:
        csv_file=csv.DictReader(fl)
        fdata={
        'key1':[data['THING'] for data in csv_file],
        'key2':[f"{data['STR1']}, {data['STR2']}, {data['STR3']}" for data in csv_file],
        'key3':[np.array([data['FL1'],data['FL2']],dtype=float) for data in csv_file],
        'key4':[int(data['POPULATION']) for data in csv_file]
        } 

问题是,除了第一个列表之外,所有的列表都是空的,第一个列表的键值为"key1",即使当删除"key4"中的类型转换时,它也不起作用,最初我认为这与NumPy、类型转换或字符串格式有关,但我不知道哪里错了,网上有很多这样的例子,使用print()调试表明数据正在被读取.我不知道在这里该怎么办.

我还确定CSV文件"Thing"、"str1"、"str2"、"str3"、"fl1"、"fl2"的键是正确的.另一件事是CSV文件很大,但不是数百万行长,

推荐答案

这看起来像是与csv.DictReader对象的迭代方式有关.当您对key1的CSV_FILE对象执行列表理解时,您耗尽了迭代器.这意味着,当您try 对key2执行列表理解时,csv_file中没有数据可供迭代,后续键依此类推.

相反,请try 首先将CSV数据读入列表,然后在此列表上执行列表理解.

试着这样做:

import numpy as np
import csv

with open(file, 'r') as fl:
    csv_file = csv.DictReader(fl)
    all_data = list(csv_file)

fdata = {
    'key1': [data['THING'] for data in all_data],
    'key2': [f"{data['STR1']}, {data['STR2']}, {data['STR3']}" for data in all_data],
    'key3': [np.array([data['FL1'], data['FL2']], dtype=float) for data in all_data],
    'key4': [int(data['POPULATION']) for data in all_data]
}

通过首先将所有行存储在ALL_DATA中,可以确保可以在不耗尽迭代器的情况下对行进行多次迭代.

Python相关问答推荐

如何使用scikit-learn Python库中的Agglomerative集群算法以及集群中声明的对象数量?

GEKKO:已知延迟的延迟系统的参数估计

具有2D功能的Python十六进制图

如何将Matplotlib的fig.add_axes本地坐标与我的坐标关联起来?

Image Font生成带有条形码Code 128的条形码时出现枕头错误OSErsor:无法打开资源

在matplotlib动画gif中更改配色方案

返回nxon矩阵的diag元素,而不使用for循环

如何计算两极打印机中 * 所有列 * 的出现次数?

即使在可见的情况下也不相互作用

删除任何仅包含字符(或不包含其他数字值的邮政编码)的观察

如何制作10,000年及以后的日期时间对象?

在Mac上安装ipython

如何更改分组条形图中条形图的 colored颜色 ?

如何让这个星型模式在Python中只使用一个for循环?

将输入聚合到统一词典中

isinstance()在使用dill.dump和dill.load后,对列表中包含的对象失败

如何更改groupby作用域以找到满足掩码条件的第一个值?

matplotlib + python foor loop

如何杀死一个进程,我的Python可执行文件以sudo启动?

手动设置seborn/matplotlib散点图连续变量图例中显示的值