运行 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_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
是我想插入到 [=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_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:]
正在使用 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_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
是我想插入到 [=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_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:]