在循环内打印每个循环中一行上的每个元素

时间:2015-10-28 07:27:13

标签: python output

我有一个这样的文件:

1:200-320    ['gene_id "xyz";transcript_id "xyzt"; exon_number "1"\n', 'gene_id "xyz";transcript_id "xyzt2"; exon_number "2"\n']
1:3000-3200    ['gene_id "xyz";transcript_id "xy"; exon_number "2"\n']

非常混乱,我希望通过首先对术语进行分组来整理它。即拉出transcript_ids并将其写为transcript_id xyzt,xyzt2; 并最终重复所有条款。

我的方法是首先使用替换

删除所有杂乱的字符
out=open('foo.txt','w')
with open('in.txt', 'r') as f:
    for line in f:
        tidyline = line.replace('[', "").strip()
        tidyline = tidyline.replace(']', "").strip()
        tidyline = tidyline.replace('"', "").strip()
        tidyline = tidyline.replace("'", "").strip()
        tidyline = tidyline.replace(",", "").strip()
        out.write("%s\n" %tidyline)

然后使用re尝试匹配字符串并撤回此信息。我可以做什么,只是不确定如何写入文件以保持它们在适当的行。

import re

with open('foo.txt', 'r') as f:
    for line in f:
        result = re.findall('transcript_id\s(\w+)',line)    
        print result
['xyzt', 'xyzt2']
['xy']

我的想法是做一些事情:

string= "transcript_id %s,%s" %(results[0], results[1])
file.write("%s\n" %string)

但因为每行的所有列表都是不同的长度,不起作用。

2 个答案:

答案 0 :(得分:1)

您可以使用string的join方法解决最后一个问题(编写可变长度列表)。试试这个:

s = "transcript_id " + ",".join(results)

要进行有关文件操作的保存,您应该将文件的开头移到with语句,以避免保留未关闭的文件:

with open('in.txt', 'r') as f, open('foo.txt','w') as out:
    ...

你真的需要在编写foo.txt的步骤之间或者这只是一个工作日吗?

我希望这会有所帮助。

答案 1 :(得分:0)

您可以将所有结果放在一个列表中,然后通过它:

transcript_id_list = []
with open('foo.txt', 'r') as f:
    for line in f:
        result = re.findall('transcript_id.*?(\w+)',line)
        if result:
            transcript_id_list.extend(result)

for item in transcript_id_list:
    string= "transcript_id %s" % item
    file.write("%s\n" % string)