You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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函数中:

  1. 直接从CSV读取的数据是字符串类型,初始化最小值/最大值时未转换为float
  2. 比较数值大小的时候用了字符串比较(如line[8] < min_concentration),这会导致逻辑错误(例如字符串"10"会被认为小于"2")
  3. 函数返回的结果是字符串列表,传递给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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.10 06:26:27