Python CSV处理代码报错:.2f无法格式化str,求定位float转换位置
Python CSV数据处理ValueError排查与修复
问题描述
开发Python程序读取CSV文件并提取统计信息,调试时触发以下错误:
Traceback (most recent call last): File "main.py", line 121, in <module> main() File "main.py", line 117, in main while run(data): File "main.py", line 104, in run print_stats(user_input, 'Minimum', minimums) File "main.py", line 88, in print_stats print (f'{stat_type} Imidacloprid Concentration: {stats[0]:.2f}') ValueError: Unknown format code 'f' for object of type 'str'
错误原因是使用.2f格式符格式化字符串类型数据,但无法定位需要转换为float的位置。
错误根源
问题出在calc_minimums和calc_maximums函数中:
- 直接从CSV读取的数据是字符串类型,初始化最小值/最大值时未转换为float
- 比较数值大小的时候用了字符串比较(如
line[8] < min_concentration),这会导致逻辑错误(例如字符串"10"会被认为小于"2") - 函数返回的结果是字符串列表,传递给
print_stats后,用.2f格式化字符串就会触发ValueError
修复方案
对calc_minimums和calc_maximums函数进行修改,在初始化和遍历过程中将对应列的字符串转换为float类型,确保数值比较和结果输出的正确性:
修复后的calc_minimums函数
def calc_minimums(filtered_data): min_concentration = float(filtered_data[0][8]) min_longevity = float(filtered_data[0][9]) min_paralyzed = float(filtered_data[0][11]) for line in filtered_data: current_conc = float(line[8]) if current_conc < min_concentration: min_concentration = current_conc current_longevity = float(line[9]) if current_longevity < min_longevity: min_longevity = current_longevity current_paralyzed = float(line[11]) if current_paralyzed < min_paralyzed: min_paralyzed = current_paralyzed return [min_concentration, min_longevity, min_paralyzed]
修复后的calc_maximums函数
def calc_maximums(filtered_data): max_concentration = float(filtered_data[0][8]) max_longevity = float(filtered_data[0][9]) max_paralyzed = float(filtered_data[0][11]) for line in filtered_data: current_conc = float(line[8]) if current_conc > max_concentration: max_concentration = current_conc current_longevity = float(line[9]) if current_longevity > max_longevity: max_longevity = current_longevity current_paralyzed = float(line[11]) if current_paralyzed > max_paralyzed: max_paralyzed = current_paralyzed return [max_concentration, max_longevity, max_paralyzed]
另外,print_stats函数中有重复打印的语句,可以顺便移除一行冗余代码:
def print_stats(user_input, stat_type, stats): print(f'{stat_type}s for {user_input} bees:') print(f'{stat_type} Imidacloprid Concentration: {stats[0]:.2f}') print(f'{stat_type} Days Paralyzed: {stats[2]:.2f}\n')
修复效果验证
修复后输入solitary,程序可以正常输出平均值、最小值和最大值,不再触发ValueError,输出示例如下:
Enter the species/genus or the sociality of bee you would like information about: solitary Averages for solitary bees: Average Imidacloprid Concentration: 29.48 Average Days Paralyzed: 1.33 Minimums for solitary bees: Minimum Imidacloprid Concentration: 5.20 Minimum Days Paralyzed: 0.50 Maximums for solitary bees: Maximum Imidacloprid Concentration: 62.10 Maximum Days Paralyzed: 2.80 Would you like to see more data? (Y/N) n
内容的提问来源于stack exchange,提问作者Deo
相关产品推荐
相关产品推荐

