Python 2.7如何跳过空值?读取水文数据遇转换错误求助
问题:处理USGS河流流量数据时的空值转换错误
我尝试读取一个包含日期及对应河流流量(单位:立方英尺/秒,cfs)的文件,部分日期对应的流量为空值(空白),希望跳过这些空值并读取其余内容。我的代码如下:
import urllib flow = 100.0 # page = urllib.urlopen('https://waterdata.usgs.gov/nwis/dv?cb_00060=on&format=rdb&site_no=08396500&legacy=&referred_module=sw&period=&begin_date=1905-10-01&end_date=2023-07-27') for line in page: text = str(page.readline(4)) if text == "USGS": page.readline(10) newdate = page.readline(10) newflow = float(page.readline(5)) if newflow is None: print("Found a null!") continue if newflow <= flow: flow = newflow date = newdate print(date) print(flow)
运行后出现以下错误:
Traceback (most recent call last): File "U:\PYTHON SCRIPTS\LOW FLOW TWO .py", line 23, in newflow = float(page.readline(5)) ValueError: could not convert string to float:
解决方案
问题分析
- 读取方式错误:用
page.readline(n)按固定长度读取内容,但USGS的RDB格式是制表符分隔文本,固定长度读取会拆碎字段或读到空值/无效字符,直接导致float()转换失败。 - 空值判断无效:文件里的空值是空白字符串,不是
None,用newflow is None根本检测不到。 - 遍历逻辑混乱:外层
for line in page已经在逐行读取,内部又调用readline(),会跳过大量行,导致数据读取不完整。
修正后的代码
import urllib.request # Python3中urllib.urlopen已移至urllib.request模块 flow = 100.0 date = "" # 用with语句管理链接,自动关闭资源 with urllib.request.urlopen('https://waterdata.usgs.gov/nwis/dv?cb_00060=on&format=rdb&site_no=08396500&legacy=&referred_module=sw&period=&begin_date=1905-10-01&end_date=2023-07-27') as page: for line in page: # 把字节流解码为字符串,去除首尾空白 line_str = line.decode('utf-8').strip() # 跳过注释行、空行和非USGS数据行 if not line_str or line_str.startswith('#') or not line_str.startswith('USGS'): continue # 按制表符分割字段(RDB格式的标准分隔符) fields = line_str.split('\t') # 确保字段数量足够,避免索引越界 if len(fields) < 4: continue newdate = fields[2] newflow_str = fields[3] # 检测空值:如果流量字段为空,直接跳过 if not newflow_str: print("Found a null!") continue # 用try-except捕获转换异常,处理非数值的无效数据 try: newflow = float(newflow_str) except ValueError: print(f"无效流量值:{newflow_str}") continue # 更新最小流量并打印 if newflow <= flow: flow = newflow date = newdate print(f"日期:{date}") print(f"当前最小流量:{flow} cfs")
关键改进点
- 使用
with语句管理网络链接,自动释放资源,代码更安全。 - 按制表符分割字段,适配RDB格式结构,彻底解决固定长度读取的问题。
- 先判断流量字段是否为空字符串,再尝试转换,从源头避免转换错误。
- 用
try-except捕获转换异常,兼容可能出现的非数值无效数据。 - 修正了Python3中
urllib模块的调用方式,避免版本兼容问题。
内容的提问来源于stack exchange,提问作者Jim
相关产品推荐
相关产品推荐

