我有一个制表符分隔的文件,如下所示:
\>WB02 \t F27C8.1
IV \t B-9641
\>WB03 \t F07C3.7
\>WB04 \t F52H2.2
\>WB04 \t F52H2.2
\>WB05 \t T13A10.10
IV \t B-15643
IV \t B-11650
IV \t B-13649
使用python,我想从以'>'开头的行中配对信息来自任何后续行的信息,所以不以“>”开头。每次都有'>'行后跟非'>'行,我想打印'>'中的第2列值line,后跟一个制表符,后跟非'>'的第2列值线。例如:
F27C8.1 \t B-9641
T13A10.10 \t B-15643
T13A10.10 \t B-11650
T13A10.10 \t B-13649
到目前为止,我已经编写了逐行读取文件的程序。在这种情况下,我需要将整个文件读入内存吗?输入文件不会超过大约30K行,总共大约10MB。在那之后,我假设我将从“对于每个不以'>'开头的行开始”从最近的前一行的第2列获取以“>”开头的值。我很欣赏任何正确阅读方向的指针 - 这比我到目前为止做的任何事都要复杂一点(宝贝步骤!)。
答案 0 :(得分:2)
你可以通过逐步读取文件来做到这一点。你只需要保留一个变量来保存最后一个>的值。你见过的那条线。所以,像这样:
with open("input.txt") as f:
lastmarkedline = None
for line in f:
if line.startswith('>'):
lastmarkedline = line
elif lastmarkedline is not None:
field1 = lastmarkedline.split()[1]
field2 = line.split()[1]
print "{0}\t{1}".format(field1, field2)
答案 1 :(得分:1)
您可以逐行处理文件,检查每一行以查看它是否以“>”开头。当您遇到以“>”开头的行时,请捕获第二列中的值。对于不以“>”开头的行,您可以输出最后捕获的值以及相关的子值。
with open('data.txt', 'r') as f:
lastHeader = ''
for line in f:
pieces = line.split('\t')
if line[0] == '>':
lastHeader = pieces[1].strip()
else:
print "%s \t %s" % (lastHeader, pieces[1].strip())
答案 2 :(得分:0)
足以跟踪以'>'
开头的最后一行。您可以根据无效输入的强大程度来调整脚本:
#!/usr/bin/env python
import fileinput
last = None
for line in fileinput.input():
mark, sep, value = line.partition('\t')
if not sep: continue # skip lines without a tab
if mark.startswith('>WB'):
last = value.strip()
elif mark.strip() == 'IV':
print('%s\t%s' % (last, value.strip()))
$ python thescript.py input.txt
F27C8.1 B-9641
T13A10.10 B-15643
T13A10.10 B-11650
T13A10.10 B-13649