运行 CSV 的每一行在 Python 中有一个模块

Running each row of a CSV with a module in Python

正在使用 Python 3.8.5

问题:CSV 文件包含 100 行,两列包含模块执行计算所需的数据。我想 运行 每行有两个数据点,获取输出并将其插入第三列。

到目前为止的操作:我找到了 CSV 模块并且可以使用 CSV.reader 来读取每一行。我可以看到如何获取数据点的输出,但看不到如何获取它们并在我需要 运行 处理数据的模块中使用它们。我还找到了 subprocess,我认为它是让我处理每一行的模块。我只是发现很难将这两者联系起来。

示例数据:

DateTime,Date,Time,Wind_Direction,Effective_Fetch,Wind_Speed
01/10/2012 00:00,01/10/2012,00:00:00,228,510,1.976
01/10/2012 00:10,01/10/2012,00:10:00,231,516,1.389
01/10/2012 00:20,01/10/2012,00:20:00,239,532,1.759

我要处理的两列是 Effective_FetchWind_Speed

模块如下:

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

wWind_SpeedLfEffective_Fetchx 是我想插入到 [=15 之后的列中的值=] 列 header “Wave_Height” - 我在 Pandas.

中阅读了其他应该也能做到这一点的模块

你可能想要这样的东西

output_rows = []
with open('mycsv.csv', newline='') as f:
    reader = csv.reader(f)
    # Skip the first (header) row
    headers = next(reader)
    for row in reader:
        # Unpack the two values we are interested in, ignore the others
        *_, effective_fetch, wind_speed = row
        # Values read from CSVs are strings, so cast them to numeric types
        result = Hs(float(wind_speed), int(effective_fetch))
        # Make a new row of the original row and the result of calling Hs
        output_rows.append(row + [result])

# Write out a new csv (if required)
with open('mynewcsv.csv', 'w', newline='') as new_f:
    writer = csv.writer(new_f)
    writer.writerow(headers + ['wave_height'])
    writer.writerows(output_rows)

csv.reader 对象是一个迭代器,因此使用 next 函数可以使它前进一步。这比在主 for 循环中有一个条件来检查我们是否正在处理第一行要简单得多。

Hs 函数需要两个输入,幸运的是它们是 csv 行中的最后两列。

*_, effective_fetch, wind_speed = row

告诉解释器将最后两列的值分配给 effective_fetchwind_speed,并将之前的所有列分配给一个名为 _ 的变量,这是一个常见的我们打算忽略的变量的命名约定(当然,您可以随意命名)。

您也可以通过行索引执行此操作,尤其是当列的放置不太方便时:

 effective_fetch, wind_speed = row[4], row[5]

或从末尾开始索引:

 effective_fetch, wind_speed = row[-2], row[-1]

或通过列表切片:

 effective_fetch, wind_speed = row[4:]
 effective_fetch, wind_speed = row[-2:]