Python 3.8.5 如何逐行处理CSV并调用自定义Hs计算模块写入新列
核心认知纠正
你之前考虑用subprocess模块打通流程的思路是走偏的:subprocess的设计用途是调用独立的外部可执行程序、跨语言的独立运行脚本,而你要调用的Hs计算函数本身就是同Python环境下可直接导入的自定义函数,根本不需要额外的进程间通信,直接在同一段代码里调用是效率最高、逻辑最简的方式。
方案1:基于内置csv模块实现(无第三方依赖)
完全适配你已经掌握csv.reader逐行读取的基础,整体流程逻辑没有额外学习成本:
- 提前定义好
Hs计算函数,或从你存放该函数的模块文件中导入 - 读取CSV时先单独处理表头:在原有表头末尾新增
Wave_Height列名 - 逐行遍历数据行时,按列位置提取
Effective_Fetch、Wind_Speed的字符串值,转为浮点型后直接传入Hs函数 - 将计算得到的结果追加到当前行末尾,统一将所有处理后的行写入新的输出CSV文件(不直接覆盖原文件,避免数据损坏)
完整示例代码:
import csv # 直接定义你的计算函数 def Hs(w, Lf): gravity=9.81 #ms^-2 slope=0.0026 x = (slope)*(gravity**(-0.53))*(w**(1.06)*(Lf**(0.47))) return x # 配置文件路径 input_path = "你的输入文件.csv" output_path = "带波高计算结果的输出文件.csv" with open(input_path, 'r', encoding='utf-8') as f_in, \ open(output_path, 'w', encoding='utf-8', newline='') as f_out: reader = csv.reader(f_in) writer = csv.writer(f_out) # 处理表头,新增Wave_Height列 original_header = next(reader) new_header = original_header + ["Wave_Height"] writer.writerow(new_header) # 逐行处理数据 for row in reader: # 列索引对应关系:Effective_Fetch为索引4,Wind_Speed为索引5(与示例CSV结构匹配) effective_fetch = float(row[4]) wind_speed = float(row[5]) # 直接调用计算函数传参 wave_height = Hs(w=wind_speed, Lf=effective_fetch) # 结果保留4位小数追加到行尾 processed_row = row + [round(wave_height, 4)] writer.writerow(processed_row)
小提示:open写文件时加newline=''是Python内置csv模块的官方推荐写法,可避免Windows环境下输出的CSV出现多余空行。
方案2:基于Pandas实现(代码更简洁,易扩展)
你之前了解到Pandas可实现写入操作,该方案的核心是利用Pandas的向量化计算能力,不需要手动写逐行循环的逻辑,计算效率更高,后续加其他处理逻辑的成本也更低:
- 用
pd.read_csv()一次性将整个CSV读为DataFrame结构 - 因为
Hs函数内的所有数学运算都支持矢量计算,可直接将两列的整列值作为参数传入,不需要逐行传值 - 将计算得到的结果赋值给DataFrame的新增列
Wave_Height - 调用
to_csv()将处理后的数据写回文件
完整示例代码:
import pandas as pd def Hs(w, Lf): gravity=9.81 #ms^-2 slope=0.0026 x = (slope)*(gravity**(-0.53))*(w**(1.06)*(Lf**(0.47))) return x # 读取CSV数据 df = pd.read_csv("你的输入文件.csv") # 直接整列传参计算,新增Wave_Height列 df["Wave_Height"] = Hs(w=df["Wind_Speed"], Lf=df["Effective_Fetch"]) # 写出文件,不保留默认的行索引 df.to_csv("带波高计算结果的输出文件.csv", index=False)
小提示:当前Hs函数没有依赖单值的分支判断逻辑,完全支持Series对象直接传入;如果后续计算函数加入了需要单值判断的分支逻辑,再通过df.apply()逐行处理即可,当前场景完全不需要。
内容的提问来源于stack exchange,提问作者Lucy Crockford
相关产品推荐
相关产品推荐

