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
相关产品推荐
相关产品推荐

