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

CSV文件中Speed列与Speedlimit列比较时if语句失效问题排查求助

排查CSV速度过滤程序的逻辑错误:为什么输出所有行?

嘿,我明白你现在的困惑——明明想筛选出超速特定百分比的行,结果程序把所有数据都输出了。咱们一步步拆解问题,先揪出最核心的错误,再聊聊其他可能的排查点。

最关键的问题:条件判断写反了!

你代码里的if条件逻辑搞反了!咱们来理一理需求:

找出**行驶速度超过限速x%**的行

换句话说,正确的逻辑应该是:实际速度 > 限速 × (1 + 百分比/100)
比如限速40,要找超过25%的,那阈值是40 × 1.25 = 50,只有实际速度大于50的行才符合条件。

但你写的条件是:

if float(row['Speed'])*factor > float(row['Speedlimit']):

这等价于实际速度 > 限速 / (1 + 百分比/100),拿刚才的例子算就是40 / 1.25 = 32——只要速度超过32就满足条件,而你的示例数据里所有速度都大于32,自然会输出全部行!

修正后的条件

把条件改成下面这样就对了:

if float(row['Speed']) > float(row['Speedlimit']) * factor:

其他值得排查的点

虽然这次核心是逻辑错误,但作为新手,以后遇到类似问题可以从这些方向检查:

  • 列名拼写与大小写:确认CSV里的列名和你代码里用的完全一致(比如是不是把Speedlimit写成了SpeedLimit?),csv.DictReader是区分大小写的。
  • 数据格式问题:检查Speed和Speedlimit列有没有非数字内容(比如空格、单位符号km/h),如果有的话转换float时会报错,或者得到错误的数值。
  • 调试中间值:可以在循环里临时打印关键数值,比如:
    for row in reader:
        speed = float(row['Speed'])
        speed_limit = float(row['Speedlimit'])
        threshold = speed_limit * factor
        print(f"Speed: {speed}, Threshold: {threshold}, Is over: {speed > threshold}")
        # 再执行判断和打印
    
    这样能直观看到每一行的判断逻辑是否符合预期。
  • 循环是否正常:你的循环没有陷入死循环,只是因为条件永远为真,所以遍历了所有行。

修正后的完整代码

import csv
if __name__ == '__main__':
    percentage = float(input(r'% over speed limit to filter by: '))
    factor = (percentage/100)+1
    with open('./cameraData.csv', 'r', encoding='UTF-8') as csvfile:
        reader = csv.DictReader(csvfile, delimiter=';')
        for row in reader:
            # 修正后的条件判断
            if float(row['Speed']) > float(row['Speedlimit']) * factor:
                print(row)

用你的示例数据测试,输入25的话,会输出速度为55、54、57的三行,符合预期~

内容的提问来源于stack exchange,提问作者Zrocks2000

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.27 16:48:14