我正在以这种方式阅读gzip压缩文件
import sys;
import gzip;
import csv;
def iscomment(s): ##function to get rid of the header of the file which every line starts with #
return s.startswith('#')
with gzip.open(sys.argv[1], 'r') as f:
for line in dropwhile(iscomment, f):
for line in csv.reader(f, delimiter="\t"):
if (int(line[1]) in myHdictionary):
print PreviousLine,"\n",line,"\n",NextLine,"\n"
else:
continue
因此,如果当前行符合IF语句,我想检索文件当前行的上一行和下一行。
任何建议都将受到高度赞赏! 提前谢谢!
答案 0 :(得分:3)
向后行动时不要试图向前看:
from collections import deque
from itertools import islice, dropwhile
import csv
def iscomment(row): return row[0][0] == '#'
with gzip.open(sys.argv[1], 'r') as f:
reader = dropwhile(iscomment, csv.reader(f, delimiter="\t"))
history = deque(islice(reader, 2), maxlen=2)
for row in reader:
if history[-1][1] in myHdictionary:
print history[0]
print history[-1]
print row
history.append(row)
您需要将csv.reader()
本身包装在dropwhile()
迭代器中(具有调整后的条件);否则你会在csv
读者永远不会看到的一开始就跳过一行。
deque
对象始终包含2个前一行,让您在浏览CSV文件时查看这些行。 history[-1]
是前一行,history[0]
之前的行。如果history[-1]
第1列位于myHdictionary
,则您的条件匹配。