csv 在Python 3.10中,Python正在从cvs文件DictReader数据中写入空列表

fwzugrvs  于 12个月前  发布在  Python
关注(0)|答案(1)|浏览(101)

所以我写了这段代码,它是为了读取一个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文件很大,但不是数百万行长,

dzhpxtsq

dzhpxtsq1#

这看起来与csv.DictReader对象的迭代方式有关。当您对key1的csv_file对象执行列表解析时,将耗尽迭代器。这意味着,当您尝试对key2执行列表解析时,csv_file中没有任何数据需要解析,后续键也是如此。
相反,尝试先将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中,可以确保可以多次遍历这些行,而不会耗尽迭代器。

相关问题