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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.23 16:36:03