修改Python脚本实现多站点气象数据正确追加至目标文件
气象站数据追加脚本修复需求
我有一个包含7个气象站数据的文本文件,每行以YYYYDOY格式日期开头(比如2022001代表2022年1月1日),后面跟着7个站点的无空格数值(数值是三位前置零填充的小数,例如001.0002.5表示两个站点值分别为1.0和2.5),需要给这个文件追加新数据。
我尝试从多个制表符分隔的新文本文件读取数据,每个文件对应一个站点(首列是年、日,后面跟着3个数据变量),转换为现有文件兼容的格式后追加。现有脚本能完成部分操作,但存在问题:单个站点的新数据被重复写入所有7个站点的位置,需要实现7个站点数据的正确导入。
原脚本问题分析
原脚本的核心缺陷:
- 仅读取单个站点的新数据文件,却通过循环将该站点的
weather值重复拼接7次,导致所有站点位置都是同一数据 - 缺少多站点数据按日期聚合的逻辑,无法将不同站点的同日期数据对应到一行的对应位置
修复后的脚本代码
import os from collections import defaultdict year0 = 2023 # 新数据起始年份 nWeatherStationsT = 7 nWeatherStationsP = 7 def makeSwatInput(txtOldData, txtNewDataList, txtfout, TorP): if TorP == 'T': nWeatherStations = nWeatherStationsT else: nWeatherStations = nWeatherStationsP # 读取原有气象数据 with open(txtOldData, 'r') as fin: dataOld = fin.readlines() # 按日期聚合所有站点数据:键为YYYYDOY日期,值为对应7个站点的数据列表 station_data = defaultdict(lambda: ['-99.0'] * nWeatherStations) # 遍历每个站点的新数据文件 for station_idx, txtNewData in enumerate(txtNewDataList): if station_idx >= nWeatherStations: break # 超出设定站点数则跳过 with open(txtNewData, 'r') as fin: dataNew = fin.readlines() # 处理当前站点的每一行数据 for row in dataNew: line = row.strip().split() if not line: continue year = int(line[0]) day = int(line[1]) date_key = f"{year0 + year - 1:04d}{day:03d}" if TorP == 'T': # 处理温度数据:拼接最低温+最高温 temp_high = float(line[2]) temp_low = float(line[3]) if temp_high > -99 and temp_low > -99: val = f"{temp_low:.1f}".zfill(5) + f"{temp_high:.1f}".zfill(5) else: val = '-99.0-99.0' elif TorP == 'P': # 处理降水数据 precip = float(line[4]) val = f"{precip:.1f}".zfill(5) if precip > -99 else '-99.0' else: print("错误:TorP参数仅支持'T'或'P'") return station_data[date_key][station_idx] = val # 将聚合后的新数据追加到原有数据 for date_key in sorted(station_data.keys()): lineOut = date_key for station_val in station_data[date_key]: lineOut += station_val dataOld.append(lineOut + '\n') # 写入最终文件 with open(txtfout, 'w') as fout: fout.writelines(dataOld) # 使用示例:传入7个站点的新数据文件路径列表 # makeSwatInput("old_data.txt", ["station1.txt", "station2.txt", ..., "station7.txt"], "output.txt", "T")
代码关键改进点
- 支持多站点文件批量读取:通过传入站点文件列表,逐个处理每个站点的数据
- 按日期聚合数据:用
defaultdict将同日期的不同站点数据对应到正确位置,避免重复写入 - 优化文件操作:使用
with语句自动管理文件资源,避免泄漏 - 增加鲁棒性:跳过空行、新增参数合法性检查,处理异常数值场景
内容的提问来源于stack exchange,提问作者GGKK
相关产品推荐
相关产品推荐

