我有一个csv文件,它是从通气气体分析程序输出的,我试图(最终)进入pd数据框。问题是文件在到达原始数据之前在顶部有一堆“摘要数据”。我无法在特定行中编程,因为用于摘要数据的行数可能因文件而异。在原始数据的顶部有一个常量可以搜索,如果我可以识别可用于基于提取的行。
下面的屏幕截图显示了excel中打开的文件 - 我希望能够搜索的部分是A27中的TIME。
当前代码我一直在努力寻找行并打印它:
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只是卡在这个小障碍上......
答案 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)
你有两个问题:
对于第一个问题,已经提供了解决方案 不过,这里还有一个使用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