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

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:

解决方案

问题分析

  1. 读取方式错误:用page.readline(n)按固定长度读取内容,但USGS的RDB格式是制表符分隔文本,固定长度读取会拆碎字段或读到空值/无效字符,直接导致float()转换失败。
  2. 空值判断无效:文件里的空值是空白字符串,不是None,用newflow is None根本检测不到。
  3. 遍历逻辑混乱:外层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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.14 04:27:34