在python中编辑文本文件并制作新的文本文件

时间:2018-08-13 13:09:27

标签: python

我有一个很大的文本文件,里面有很多物品。每个项目有2行。第一行(即ID行)以>开头,而属于ID行(其上方一行)的第二行是一个字符序列。这个小例子是我的文本文件中的2个项目(真实文件中有很多项目一个接一个)。

小例子:

>NST00000373840.4|ENSG00000119396.6|OTTHUMG00000020582.1|OTTHUMT00000053857.1|RAB14-001|RAB14|4145|UTR5:1-99|CDS:100-199|UTR3:200-221|
ATCTTGGACCAGCCCGAGGAAGATACTGAGGGAGCACAGGAGCAGTCACCGCTGCCACTGCTACTGCCGCTACTGCTGCCGGCGCGTCTGCACCTCTCGGCCTGCCAGTGTACCTGCCGGCGCCTCGGTCGACCGCCCCCGCCCCCTCTCCCGCTGCGTCCGCACTCCTGTTCCTGGTCCTGACGCCCCCCTCCCGCCCGGAAAGCTGCCCAGCCACCAGC
>ENST00000396625.3|ENSG00000081052.10|OTTHUMG00000149892.1|OTTHUMT00000313770.1|COL4A4-001|COL4A4|9895|UTR5:1-150|CDS:151-205|UTR3:206-335|
CGAGAGCGCCGCGAAGAGGCAGCGGGGCGCGGGTGGATTGGGGCTGGAGGTGCGCGTCCCGTGGGGTGGCAAGGCGGCAGCTCCTGGCGCTGCGGGCGTCCCCACAGGAACAGACTTTGACCCAGAACACAGAACCTCACTTGTCAACAAGAACCTTCTGGAAGAGAAGACTGGCAGAATATTTTTTAAGTACTAAGACTTGCCTGCGATGTGGTCTCTGCACATAGTACTAATGAGGTGCTCCTTCAGATTGACCAAGTCCTTGGCCACAGGTCCCTGGTCACTTATACTCATTCTCTTTTCTGTACAATATGTATATGGGAGTGGAAAGAAAT

如您所见,在CDS行中有ID,在其前面有一系列数字。我想采用此范围并提取序列行中的字符。例如,在上面的示例中,对于第一个IDCDS前面的范围是100-199,因此我想将字符数100提取到字符数{如我在预期输出中所示,{1}}。 同样在199行中,各列也是ID分隔的。在|的新文件(预期结果)中,我只需要ID行的第六列。

预期输出:

ID

我想对文本文件中的所有项目执行相同的操作。

为此,我首先尝试将文件导出到>RAB14 CCTGCCAGTGTACCTGCCGGCGCCTCGGTCGACCGCCCCCGCCCCCTCTCCCGCTGCGTCCGCACTCCTGTTCCTGGTCCTGACGCCCCCCTCCCGCCC >COL4A4 AACCTTCTGGAAGAGAAGACTGGCAGAATATTTTTTAAGTACTAAGACTTGCCT 中的dictionary行中,其中pythonkeys行,而{{1} }是序列。就像这本字典。

ID

然后可以将键导出到列表中,并将值导出到另一个列表中。

values

,但结果与我想要的不一样。你知道如何解决吗?

1 个答案:

答案 0 :(得分:0)

您可以仅通过splitlines()读取行,并使用常规split来完成您需要的其他所有事情,而不是像dict那样。 检查以下代码。

sequence = '>NST00000373840.4|ENSG00000119396.6|OTTHUMG00000020582.1|OTTHUMT00000053857.1|RAB14-001|RAB14|4145|UTR5:1-99|CDS:100-199|UTR3:200-221|ATCTTGGACCAGCCCGAGGAAGATACTGAGGGAGCACAGGAGCAGTCACCGCTGCCACTGCTACTGCCGCTACTGCTGCCGGCGCGTCTGCACCTCTCGGCCTGCCAGTGTACCTGCCGGCGCCTCGGTCGACCGCCCCCGCCCCCTCTCCCGCTGCGTCCGCACTCCTGTTCCTGGTCCTGACGCCCCCCTCCCGCCCGGAAAGCTGCCCAGCCACCAGC'
cds = [i for i in sequence.split('|') if 'CDS' in str(i)] # O/P ['CDS:100-199']
from_range = int(cds[0].split(':')[-1].split('-')[0]) # O/P 100
end_range = int(cds[0].split(':')[-1].split('-')[-1]) # O/P 199
required_seq = sequence.split('|')[-1][from_range:end_range] # O/P CCTGCCAGTGTACCTGCCGGCGCCTCGGTCGACCGCCCCCGCCCCCTCTCCCGCTGCGTCCGCACTCCTGTTCCTGGTCCTGACGCCCCCCTCCCGCCC

希望这会有所帮助。