python中的基本数据格式

时间:2014-06-18 12:46:54

标签: python

我想格式化包含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

2 个答案:

答案 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),以便让自己更容易。

希望有帮助...这项任务比看似棘手!