【问题标题】:Need help in finding the row of CSV which contains the values in array在查找包含数组中值的 CSV 行时需要帮助
【发布时间】:2018-08-08 15:51:04
【问题描述】:

我有一个数组 LiveTick = ['ted3m index','US0003m index','USGG3m index'],我正在读取一个 CSV 文件 book1.csv。我必须找到包含 csv 中的值的行。

例如,第 15 行将包含 ted3m index 500 | 600,第 20 行将包含 US0003m index 800 | 900,以此类推。

然后我必须获取行中包含的值,并为数组LiveTick 中包含的每个值解析它。我该如何进行?下面是我的示例代码:

 with open('C:\\blp\\book1.csv', 'r') as f:
   reader = csv.reader(f, delimiter=',')
   writer = csv.writer(outf)
   for row in reader:
      for list in LiveTick:
         if list in row:
            print ('Found: {}'.format(row))

【问题讨论】:

  • 这个csv有标题吗?
  • 没有。它仅在第一列中具有值

标签: python arrays csv


【解决方案1】:

您可以使用 pandas,它的速度非常快,并且开箱即用地为您完成所有读取、写入和过滤工作:

import pandas as pd

df = pd.read_csv('C:\\blp\\book1.csv')
filtered_df = df[df['your_column_name'].isin(LiveTick)]

# now you can save it
filtered_df.to_csv('C:\\blp\\book_filtered.csv')

【讨论】:

  • 这不一定比 OP 试图实现的更有效。例如,对于非常大的数据帧,它可能无法工作,因为需要将所有数据保存在内存中。
  • @Bendeberia 我得到空数据框作为输出。我必须搜索 LiveTick 中的项目是否存在于 CSV 文件的行中。例如第 15 行有 ted3m 索引 500 | 600. 我必须为列表中的 'ted3m index' 项获取此值。我觉得我们正在寻找其他方式。
【解决方案2】:

您的想法是正确的,但您可以进行一些改进:

  • 不要使用不会短路的嵌套for 循环,而是使用any 将第一列与多个值进行比较。
  • 在进行过程中写入您的 csv,而不仅仅是 print。这样可以节省内存,因为您每次只能在内存中保存一行。
  • with 语句中将outf 定义为open 对象。
  • 不要隐藏内置list。使用另一个标识符,例如i,用于LiveTick 中的元素。

这是一个演示:

with open('in.csv', 'r') as f, open('out.csv', 'wb', newline='') as outf:
    reader = csv.reader(f, delimiter=',')
    writer = csv.writer(outf, delimiter=',')
    for row in reader:
        if any(i in row[0] for i in LiveTick):
            writer.writerow(row)

【讨论】:

  • 它无法正常工作。我必须搜索 LiveTick 中的项目是否存在于 CSV 文件的行中。例如第 15 行有 ted3m 索引 500 | 600. 我必须为列表中的 'ted3m index' 项获取此值
  • Its not working properly。抱歉,这对我来说还不够。尝试调试并找出哪条线路不适合您,我可以尝试并提供帮助。
  • 我在“out.csv”中得到空输出。我觉得我们正在寻找其他方式。查看 LiveTick 列表中是否存在行值。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-09-12
  • 2019-11-14
  • 2021-03-27
  • 2013-12-27
  • 2013-05-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多