gpt4 book ai didi

python - 如何从 CSV 文件中提取目标行、前一行和后行?

转载 作者:太空宇宙 更新时间:2023-11-04 09:42:03 27 4
gpt4 key购买 nike

我一直在尝试弄清楚如何使用 for 循环和 python 中提供的 enumerate 对象来完成此操作。我有一个格式为 HH:MM 的时间。我有一个 csv 文件,其中第一列是时间戳,后面是相同格式的时间戳。然后我在文件中搜索匹配时间,然后我提取该行以便稍后转换为 XML 文件。但是,我还需要提取目标行之前和之后的行。我尝试了以下代码:

def findRow(timeID, filename):
rows = []
csvFile = csv.reader(open(filename, "rb"), delimiter=",")
for i, row in enumerate(csvFile):
if timeID == timeInRow:
rows.append(i-1)
rows.append(i)
rows.append(i+1)
return rows

但是,不久之后我意识到这不是正确的方法,因为我提取的是索引而不是值。我需要的是 row[i-1]、row[i]、row[i+1] 之类的东西。换句话说,我需要与该行匹配的元素。

有没有简单的方法来做到这一点?我考虑过使用 range(csvFile) 但老实说我不知道​​最终会做什么。

最佳答案

我会使用不同的方法:

  • 将上一行存储在循环中
  • 如果匹配,则使用next获取下一行,并返回3行

像这样(我添加了一条评论,因为 timeInRow 应该从 row 中提取,但您的代码没有显示它):

prev_row = []  # just in case it matches at first row
for row in csvFile:
# something must be done to extract timeInRow from row here!
if timeID == timeInRow:
return [prev_row,row,next(csvFile,[])]
prev_row = row # save current row for next iteration

next 使用默认的空列表值,以防 last 行匹配(避免 StopIteration 异常)

这种线性方法可行,但如果行按时间排序并且您需要执行多次搜索,更好的方法(更快)可能会创建一个行列表,一个时间列表,然后使用 bisect 模块计算时间列表中的插入点,检查时间是否匹配,并使用索引返回行列表的一部分。

类似于:

list_of_rows = list(csvFile)
list_of_times = [x[3] for x in list_of_rows] # assume that the time is the 4th column here
i = bisect.bisect(list_of_rows,timeInRow)
if i < len(list_of_rows) and list_of_rows[i] == timeInRow:
return list_of_rows[max(i-1,0):min(i+2,len(list_of_rows)]

如果您只需要执行 1 次搜索,这会比较慢,因为无论如何您都必须创建列表,所以 O(n) + O(log(n))。但是如果你想在同一个列表中执行多次搜索,每次搜索的成本是 O(log(n))

关于python - 如何从 CSV 文件中提取目标行、前一行和后行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51333007/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com