Python API轮询获最新数据:变量相等判断异常排查
问题排查:CSV与API数据值相等但判断不匹配
需求是调用API获取数据,与本地CSV存储的数据对比,若有新数据则更新CSV并返回DataFrame。但当前代码中,变量second_cell和lastItem1看起来值相同,却无法通过if相等判断,导致无法进入循环等待新数据。
核心原因
- 类型不匹配:
lastItem1是从pandas DataFrame取出的数值类型(如float64),而second_cell是从CSV读取的字符串类型,不同类型直接比较会返回False。 - 隐藏空白字符:手动拆分CSV行时,
second_cell可能带有换行符(\n)或前后空格,视觉上和lastItem1一致,但实际内容存在差异。
修复方案
- 统一数据类型:将CSV读取的字符串转换为数值类型,或直接用pandas读取CSV自动处理类型。
- 处理浮点精度:浮点数值比较时,用误差范围替代严格相等判断,避免精度问题。
- 优化读取逻辑:用pandas读取CSV,避免手动拆分字符串的潜在错误。
修改后的代码
import pandas_datareader as pdr import datetime import pandas as pd def datagetter(): i = 1 while i < 120: start = datetime.datetime(2005, 1, 1) end = datetime.datetime(2040, 1, 1) df = pdr.DataReader('PAYEMS', 'fred', start, end) lastItem1 = df["PAYEMS"].iloc[-1] print("Latest item from Fred API: ", lastItem1) # 用pandas读取CSV,自动处理类型和格式 try: df_csv = pd.read_csv('PAYEMS.csv', index_col=0) last_csv_value = df_csv["PAYEMS"].iloc[-1] except FileNotFoundError: # 首次运行无CSV时直接创建并返回 df.to_csv("PAYEMS.csv") print("returning dataframe (CSV created)") return df print("Last Item, in thousands", last_csv_value) # 浮点数值用误差范围判断相等 if abs(last_csv_value - lastItem1) < 1e-9: print(f"CSV {last_csv_value} API {lastItem1} 数据一致,将继续等待新数据") print(f"尝试次数: {i}") i += 1 else: df.to_csv("PAYEMS.csv") print("returning dataframe") return df df = datagetter() print(df.tail(3))
修改说明
- 用
pandas.read_csv替代手动读取拆分CSV,自动处理数据类型和格式,避免字符串操作错误。 - 浮点比较使用
abs(a - b) < 1e-9,规避浮点精度导致的判断失误。 - 增加了CSV文件不存在的异常处理,首次运行时自动创建文件并返回数据。
内容的提问来源于stack exchange,提问作者PythonicChris
相关产品推荐
相关产品推荐

