我想格式化包含7000个条目的文本文件,并使用以下代码对事物进行排序。但是在过去的几周里,我遇到了一个问题: (输入数据如下)
USER_PROTEIN_ID = P25358
SMART_PROTEIN_ID = uniprot | P25358 | ELO2_YEAST
NUMBER_OF_FEATURES_FOUND = 8
DOMAIN = Pfam结构:ELO
START = 63
END = 307
安勤= 2.4E-64
TYPE = PFAM
Code.py
file=open('r.txt').readlines()
for line in file:
line= line.rstrip()
if re.search('USER|DOMAIN|STATUS=visible|OK', line):
line= re.sub(r'USER_PROTEIN_ID = |DOMAIN=Pfam:|\s','', line)
print(''.join(line))
我得到的是:
P53242
Vac_ImportDeg
STATUS=visible|OK
P40850
DOMAIN=XPGN
STATUS=visible|OK
XPG_N
DOMAIN=XPGI
STATUS=visible|OK
XPG_I
MKT1_N
STATUS=visible|OK
MKT1_C
STATUS=visible|OK
但是我希望打印以sep = \ t中的条目(例如P53242)的早期行开始的结果:
P53242 Vac_ImportDeg STATUS=visible|OK
P40850 DOMAIN=XPGN STATUS=visible|OK XPG_N DOMAIN=XPGI STATUS=visible|OK XPG_I MKT1_N
答案 0 :(得分:2)
没有内容文件。
使用:
print re.sub(r'(P\d+)',r'\n\1 ',re.sub(r'\n','',line))
而不是:
print(''.join(line))
答案 1 :(得分:0)
如果没有看到实际的输入文件(格式化,新线完好无损),很难分辨,但看起来你正在尝试做的是输入一个输入文件,其中条目可以跨越多行,并以每个条目在其自己的行上的格式打印出来,并且值由制表符分隔。
这里的问题是你要逐行浏览输入 - 你使用readlines()
,它会返回一个行列表,然后在你的循环中逐行迭代{ {1}}。这不会起作用,因为您必须一次读取多行才能获得一个条目。
我建议摆脱for line in file:
循环并立即读取文件的所有内容,然后从那里解析它。此外,请记住,只要您for line in file:
文件,就必须在完成文件后open()
。最好的方法是使用上下文管理器(请参阅下面的close()
行):
with open(...
现在你需要解决的唯一问题就是编写一个正则表达式模式,它可以告诉下一个条目,这实际上非常复杂,并且会涉及“负向前瞻”。"说实话,我无法弄清楚如何正确使用否定前瞻:)如果您有兴趣,请参阅re模块上的python文档,其中包括some very helpful information about regular expression syntax。
鉴于这个问题的复杂性,我实际上建议使用解析库(Python有about 3 billion of them),以便让自己更容易。
希望有帮助...这项任务比看似棘手!