【问题标题】:Running each row of a CSV with a module in Python使用 Python 中的模块运行 CSV 的每一行
【发布时间】:2021-04-23 21:02:19
【问题描述】:

在 Python 3.8.5 中工作

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

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

示例数据:

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 是我想插入到 Wind_Speed 后面的列中的值,列标题为“Wave_Height” - 我已经阅读在 Pandas 中也应该能够做到这一点的其他模块。

【问题讨论】:

  • subprocess 似乎是一条红鲱鱼,您不需要它来处理 CSV 文件中的行,而是用于启动子进程(= 其他程序)。
  • 啊,好吧,所以我走错了路。请就最好的前进方式提出任何建议吗?我想知道我是否只是编写另一个模块,只是将数据提取到一个新列表中,但我仍然无法弄清楚如何绘制每个数据点并使用它(我有脚本在 R 中执行此操作,而不是 Python,但它必须是python)

标签: python python-3.x csv subprocess data-processing


【解决方案1】:

你可能想要这样的东西

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:]

【讨论】:

  • 你太棒了,谢谢。昨晚考虑到这一点,我脑子里有点想沿着这条路走下去,但是拥有一些看起来会起作用的东西真是一种解脱。感谢您向我介绍“下一个”,确实可以方便地跳过标题。也是我对“with”的第一次介绍——我想我也会把它添加到我的教学中,因为它很有用。
  • 我已经尝试过了。大部分都在工作。我又被困住了。多亏了你的脚本,我可以很好地生成新的计算数据。但是,如果我打印(结果)它只显示列表中的最后一个值,而不是所有值。这会导致问题,因为我似乎无法将所有值附加到新列中。我一直在遵循这里的指示:thispointer.com/python-add-a-column-to-an-existing-csv-file
  • 代码的最后一行 > 带来了错误(output_rows 未定义)。如果我用 print(result) 替换它,那么我可以看到生成的所有数据,所以我知道 > 行工作正常。我尝试将 output_rows 定义为原始 CSV 文件,实际上我尝试了很多东西...@snakecharmerb
  • 糟糕,对于缺少 output_rows 感到抱歉 - 它应该是 list - 我已将其添加到答案中的代码中。
  • 没问题...错过了这么简单的一点。甚至我的丈夫也说我需要创建一个数组(或空列表),但我没有意识到我需要将它放在代码之前,我想得太难了 sigh 再次感谢你。我怀孕了,所以我的大脑现在也很垃圾:(休产假@snakecharmerb
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-24
  • 1970-01-01
  • 1970-01-01
  • 2022-08-04
  • 1970-01-01
相关资源
最近更新 更多