Python报错:float对象不可迭代,求CSV浮点数数组遍历方案
问题分析与修正方案
错误根源
你触发float object is not iterable的原因很明确:
- 处理CSV每一行时,你把
temperature、pressure、humidity赋值成了单个浮点数(比如某一行的温度值); - 但之后在
max_temperature()这类函数里,你却尝试用for i in temperature遍历这个单值浮点数——浮点数是不可迭代的类型,自然报错。
另外你的逻辑还有个核心误区:你在处理每一行数据时就想计算全局的最大/最小统计值,但这些统计应该在所有行都读取并验证完成后再做,而不是嵌套在单行循环里。
修正步骤
- 先完成所有合法读数的收集:遍历每一行,验证当前行的温度、气压、湿度是否合法,合法就创建
WeatherReading实例加入列表; - 把统计最大/最小的逻辑移到收集完所有读数之后,基于完整的读数列表计算;
- 移除循环内部定义的三个无效统计函数(它们的逻辑完全错误,因为操作的是单值而非集合)。
修正后的完整代码
import pickle from weatherreading import WeatherReading def valid_temperature(temperature: float): return -40 < temperature < 85 def valid_pressure(pressure: float): return 300 < pressure < 1200 def valid_humidity(humidity: float): return 20 < humidity < 80 def valid_reading(temperature: float, pressure: float, humidity: float): return valid_temperature(temperature) and valid_pressure(pressure) and valid_humidity(humidity) def get_readings_from_file(filename: str, skip_first_line: bool) -> list[WeatherReading]: all_readings: list[WeatherReading] = [] with open(filename, "r") as file: first_line = True for line in file: if skip_first_line and first_line: first_line = False continue # 处理行数据,去除换行符避免干扰 split = line.strip().split(",") try: temperature = float(split[0]) pressure = float(split[1]) humidity = float(split[2]) except (IndexError, ValueError): # 跳过格式错误的行,避免程序崩溃 print(f"跳过格式错误的行: {line}") continue # 验证当前单条读数是否合法,合法则加入列表 if valid_reading(temperature, pressure, humidity): reading = WeatherReading(temperature, pressure, humidity) all_readings.append(reading) return all_readings if __name__ == "__main__": filename = input("Enter CSV file name: ") all_readings = get_readings_from_file(filename, True) print("Your readings:") for reading in all_readings: print(f" Temp: {reading.temperature}", end="") print(f" Pressure: {reading.pressure}", end="") print(f" Humidity: {reading.humidity}") # 如果需要计算全局统计值,在这里处理 if all_readings: max_temp = max(reading.temperature for reading in all_readings) min_press = min(reading.pressure for reading in all_readings) max_hum = max(reading.humidity for reading in all_readings) print("\n统计结果:") print(f"最高温度: {max_temp}") print(f"最低气压: {min_press}") print(f"最高湿度: {max_hum}") # 序列化保存数据,用with语句自动关闭文件 with open('pickle_demo.bin', 'wb') as pickle_demo: pickle.dump(all_readings, pickle_demo)
关键说明
- 新增异常处理:如果CSV行格式错误(比如列数不足、无法转成浮点数),程序会跳过该行并提示,避免直接崩溃;
- 统计逻辑移至主函数:基于完整的
all_readings列表,用生成器表达式高效计算全局统计值; - 修复核心逻辑错误:现在每个
WeatherReading实例对应CSV中的一行合法数据,而非错误地用统计值创建实例。
内容的提问来源于stack exchange,提问作者Stephen Martinez
相关产品推荐
相关产品推荐

