Python新手求助:将CSV文件读取为浮点数组
解决CSV读取为浮点数组的问题
嘿,我来帮你搞定这个问题~你的代码里混了不少Matlab的语法习惯,Python处理CSV转浮点数组的逻辑不太一样,我先帮你梳理下原代码的问题,再给你可行的解决方案。
原代码里的几个关键问题
- 文件作用域错误:
with open块结束后,文件会自动关闭,所以你在块外面定义的NP = csv.DictReader(csvfile)其实已经无法读取内容了,所有处理逻辑都要放在with块内部。 - Matlab语法误用:Python里没有
size()函数,也不能用NP(i,j)这种括号索引,要换成len()获取长度,方括号[]做索引。 - 变量名错误:第二个文件打开时写了
csvfule(应该是csvfile),而且重复用了csvfile变量,会覆盖之前的文件对象。 - DictReader的理解偏差:
csv.DictReader返回的是每行一个字典的迭代器,不是二维数组,不能直接按行列索引访问。
解决方案一:直接生成二维浮点列表(无列名)
如果不需要保留CSV的列名,用csv.reader会更直接,配合列表推导式可以快速转成浮点数组:
import csv # 读取NP.csv为二维浮点列表 with open('NP.csv', 'r') as csvfile: reader = csv.reader(csvfile) # 跳过表头(如果你的CSV没有表头,就删掉这行) next(reader) # 把每行的每个单元格转成float NP = [[float(cell) for cell in row] for row in reader] # 读取A.csv同理 with open('A.csv', 'r') as csvfile_a: reader_a = csv.reader(csvfile_a) next(reader_a) A = [[float(cell) for cell in row] for row in reader_a] # 获取行列数 r, c = len(NP), len(NP[0]) if NP else 0 r2, c2 = len(A), len(A[0]) if A else 0
解决方案二:保留列名的字典列表
如果需要保留CSV的列名(比如按列名访问数据),可以用csv.DictReader把每个字段转成浮点:
import csv with open('NP.csv', 'r') as csvfile: reader = csv.DictReader(csvfile) NP = [] for row in reader: # 把当前行的所有值转成float,保留列名作为键 float_row = {key: float(value) for key, value in row.items()} NP.append(float_row) with open('A.csv', 'r') as csvfile_a: reader_a = csv.DictReader(csvfile_a) A = [] for row in reader_a: float_row = {key: float(value) for key, value in row.items()} A.append(float_row) # 获取行列数:行数是列表长度,列数是字典的键的数量 r = len(NP) c = len(NP[0].keys()) if NP else 0
进阶:处理非数字单元格
如果CSV里有无法转成浮点的内容(比如空值、字符串),可以加个容错处理,用NaN代替错误值(需要先安装numpy:pip install numpy):
import csv import numpy as np with open('NP.csv', 'r') as csvfile: reader = csv.reader(csvfile) next(reader) NP = [] for row in reader: float_row = [] for cell in row: try: float_row.append(float(cell)) except ValueError: # 遇到无法转换的内容,用NaN填充 float_row.append(np.nan) NP.append(float_row)
内容的提问来源于stack exchange,提问作者Megan Heydari
相关产品推荐
相关产品推荐

