Python中含float数组访问、CSV读取及函数报错问题排查
解决CSV导入与随机采样函数的两个问题
问题1:数组第一个元素为空的原因
你碰到的这个情况,大概率是CSV文件的第一行是表头,但你读取时没跳过这一行。比如用csv.reader读取文件时,第一行返回的是列名,如果row[1]对应的列名本身是空值,那append到v里的第一个元素自然就是空字符串了。
另外也有可能是CSV的分隔符不匹配——比如你的文件实际用分号;分隔数据,但你用了默认的逗号,解析,导致row的结构不符合预期,row[1]取不到正确的数值,反而拿到空内容。
解决建议:
- 如果第一行是表头,读取前先跳过:比如用
next(reader)先读取并丢弃表头行,再循环读取数据行。 - 检查CSV的分隔符,确保和
csv.reader的delimiter参数匹配,比如csv.reader(f, delimiter=';')。
问题2:"can't multiply sequence by non-int of type float" 错误解析
这个错误和append完全无关——append对float类型的元素支持得很好,问题出在你从CSV读取的元素是字符串类型,而非数值类型!
CSV文件里的数字默认会被读取成字符串,哪怕它看起来是小数。当你的makeRandomList函数执行values[random_num]*1.0时,相当于拿一个字符串去乘以float,而Python里字符串只能和整数相乘(用来重复字符串),和float相乘就会抛出这个错误。
解决步骤:
- 读取CSV时,把
row[1]转成float再append到v里:
如果v.append(float(row[1]))row[1]可能存在空值或非数字内容,建议加异常处理避免崩溃:try: v.append(float(row[1])) except ValueError: # 可以选择跳过无效数据,或者设置默认值 pass - 顺带提一句:你的
makeRandomList当前是有放回随机采样,如果需要无放回采样,可以直接用random.sample(values, length),会更简洁。只要传入的values是数值类型(int/float),函数就不会再报错了。
内容的提问来源于stack exchange,提问作者user9158336
相关产品推荐
相关产品推荐

