Python:搜索csv文件以获取特定字符串并存储行号以供以后使用

时间:2017-09-19 11:53:04

标签: python-3.x csv

我有一个csv文件,它是从通气气体分析程序输出的,我试图(最终)进入pd数据框。问题是文件在到达原始数据之前在顶部有一堆“摘要数据”。我无法在特定行中编程,因为用于摘要数据的行数可能因文件而异。在原始数据的顶部有一个常量可以搜索,如果我可以识别可用于基于提取的行。

下面的屏幕截图显示了excel中打开的文件 - 我希望能够搜索的部分是A27中的TIME。

enter image description here

当前代码我一直在努力寻找行并打印它:

import csv

with open('parvo_sb.csv', 'rU') as csvfile:
    datareader = csv.reader(csvfile)
    for row in datareader:
        if row[0] == 'TIME ': # the file oddly saves with a space after TIME
            print(row)

但是引发了以下错误:

Traceback (most recent call last):
  File "/Users/Desktop/Parvo/import.py", line 6, in <module>
    if row[0] == 'TIME ':
IndexError: list index out of range

我没有得到的错误是,如果我,例如,打印(行[0])我得到相同的错误,但如果我打印(行[:1]),我可以打印'时间'并没有得到错误。

一旦我有行号,我就有代码将所有内容提取到pd df只是卡在这个小障碍上......

3 个答案:

答案 0 :(得分:0)

当您有空行时,使用row[0]是危险的,并且可能以您已经知道的错误结束。

此外,为了避免匹配'TIME '而不是'TIME',您可以使用strip()startswith()字符串方法。

你应该尝试:

if len(row) > 1:
    first_col = row[0].strip()
    if first_col == 'TIME':
        # your logic goes here

或者,如果您不想定义新变量:

if len(row) > 1:
    if row[0].startswith('TIME'):
        # your logic goes here

答案 1 :(得分:0)

你有两个问题:

  1. 索引访问无效。
  2. 按照标题存储匹配的行号。
  3. 对于第一个问题,已经提供了解决方案 不过,这里还有一个使用EAFP 关于第二个问题,您可以使用枚举和跟踪变量:

    import csv
    
    first_time_line = None
    
    with open('parvo_sb.csv', 'rU') as csvfile:
        datareader = csv.reader(csvfile)
        for line, row in enumerate(datareader):
            try:
                first_column = row[0]
            except IndexError:
                continue
            else:
                # the file oddly saves with a space after TIME
                if first_column.strip() == 'TIME': 
                    print(row)
                    if first_time_line is None:
                        first_time_line = line
    

答案 2 :(得分:-1)

另一个解决方案可能是您可以将文件存储到内存中以便使用此代码进行快速处理,而不是一次又一次地执行I / O操作。

import csv

csvfile = open('my.csv','rb')
csvFileArray = []
for row in csv.reader(csvfile, delimiter = ','): // Check your delimiter as well
		csvFileArray.append(row) // Storing the data into memory
print(csvFileArray[0][0]) //get the 'Time' over here, easily iterable 2Darray