如何解决使用 Python 中的模块运行 CSV 的每一行
使用 Python 3.8.5
问题:包含 100 行、两列的 CSV 文件,其中包含模块执行计算所需的数据。我想用两个数据点运行每一行,获取输出并将其插入第三列。
到目前为止的操作:我找到了模块 CSV 并且可以使用 CSV.reader 来读取每一行。我可以看到如何获得数据点的输出,但不知道如何获取它们并在我需要运行以处理数据的模块中使用它们。我还找到了子流程,我相信它是让我处理每一行的模块。我只是发现很难将这两者联系起来。
示例数据:
gradle app:dependencies
我要处理的两列是 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,00:10:00,231,516,1.389
01/10/2012 00:20,00:20:00,239,532,1.759
和 Effective_Fetch
。
模块如下:
Wind_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
是 w
,Wind_Speed
是 Lf
,Effective_Fetch
是我想插入到 x
之后的列中的值使用列标题“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 行中的最后两列。
*_,wind_speed = row
告诉解释器将最后两列的值赋给effective_fetch
和wind_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:]
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。