如何从文件中选择特定的信息? Python的
问题描述:
我刚开始使用这个新的计划,如下图所示,其在一个奇怪的格式输出:如何从文件中选择特定的信息? Python的
CRISPR 10 Range: 7784249 - 7784543
POSITION REPEAT SPACER
-------- -------------------------------- ---------------------------------
7784249 GTTTCAATCCACGCCCCCGCATGGGGGGCGAC GTTAAGATTTTCAGCCGAAGCATAAGACTGCTCA [ 32, 34 ]
7784315 GTTTCAATCCACGCCCCCGCATGGGGGGCGAC ATCAATAACAATACCTTGCTTTTCAGTTTCATT [ 32, 33 ]
7784380 GTTTCAATCCACGCCCCCGCATGGGGGGCGAC TATAACTTTCTCCTTCTATTGTTGATGTAACATA [ 32, 34 ]
7784446 GTTTCAATCCACGCCCCCGCATGGGGGGCGAC TTTTCATTTGCATCAAGTTCTTTTTCAAGGTCAA [ 32, 34 ]
7784512 GTTTCAATCCACGCCCCCG>CONTIG-97480
-------- -------------------------------- ---------------------------------
Repeats: 5 Average Length: 32 Average Length: 33
CRISPR 11 Range: 8822044 - 8822520
POSITION REPEAT SPACER
-------- ------------------------------------- ------------------------------------
8822044 GTGTCAATGCCCTATATCGGGCGCACTTCATTTCTAC TTTACCAATCTCGGCTCTTTACTCCCGCTGGGTGCATT [ 37, 38 ]
8822119 GTGTCAATGCCCTATATCGGGCGCACTTCATTTCTAC TTAAAGCAGATACAAAGAAGCCTTGTGAGGAATATT [ 37, 36 ]
8822192 GTGTCAATGCCCTATATCGGGCGCACTTCATTTCTAC TATACTTCAGAAGTGCTGAGTTCCAGAAGCTTTTT [ 37, 35 ]
8822264 GTGTCAATGCCCTATATCGGGCGCACTTCATTTCTAC AAATATATGATTAATAATAAGAATAATCAAATAGTA [ 37, 36 ]
8822337 GTGTCAATGCCCTATATCGGGCGCACTTCATTTCTAC TTTCGTGGTTCCATCTGCTTATGAAACATTATTGATCT [ 37, 38 ]
8822412 GTGTCAATGCCCTATATCGGGCGCACTTCATTTCTAC GGATGAGGCTGGTACATATACGTACCTGGTTCTTC [ 37, 35 ]
8822484 GTGTCAATGCCCTATATCGGGCGCACTTCAT>CONTI
-------- ------------------------------------- ------------------------------------
Repeats: 7 Average Length: 37 Average Length: 36
我不知道我怎么会去只选择第三列的字符串,并将其打印到一个新的文件。我也想给每个部分的标题,以及下一个程序,以便例如输出的“CRISPR 11”的第一行:
>CRISPR_11_8822044_8822520_1
TTTACCAATCTCGGCTCTTTACTCCCGCTGGGTGCATT
这样的名称是由达“>”,那么CRISPR号码,那么范围值和最终号码就是它的顺序,例如它的1,因为它是这组中的第一个。
我知道如何写入文件,但不知道如何选择文件的相关部分。
任何帮助将是伟大的。
答
答案与NewWorld的评论一样,只是一堆正则表达式,分割和列表解析。虽然我确信有更简洁明了的方式来做这件事,但我会这样做。
该代码通过线路输入文件线延伸,
- 如果行开始字母“C”,或它是该文件的结束时,从行的特定字符串被拾取用于分配名称
- 如果该行以数字开头,则选择该行中包含A/T/G/C的第二个字符串至少5次。你可以改变这个正则表达式,如果你永远都不想结束CONTI
我救了你的文本字符串挑到一个文件 example.txt中,跑了这一点。
import re
secondbases = []
with open('/example.txt','r') as contents:
for line in contents:
splitline = line.split()
if line[0] == 'C': #If line begins CRISPR, write new info to file and save new CRISP values
if secondbases != []:
outputfile = open('/output.txt','a') #With ain't workin for me here, but replace at your own desire
x = 1
for base in secondbases:
outputfile.write('>CRISPR_' + crispno + '_' + rangestart + '_' + rangeend + '_' + str(x) + ' ' + base + '\n')
x += 1
outputfile.close()
secondbases = []
(crispno,rangestart,rangeend) = (splitline[1],splitline[3],splitline[5])
elif re.search('[0-9]',line[0]): #If base lines, copy second base string to list
bases = []
for a in splitline:
if re.search('[GTCA]{5,}',a):
bases = bases + [a]
if len(bases) > 1:
secondbases = secondbases + [bases[1]]
elif line[len(line)-1] != '\n' and secondbases != []:
outputfile = open('/output.txt','a')
x = 1
for base in secondbases:
outputfile.write('>CRISPR_' + crispno + '_' + rangestart + '_' + rangeend + '_' + str(x) + ' ' + base + '\n')
x += 1
outputfile.close()
哪个输出包含
>CRISPR_10_7784249_7784543_1 GTTAAGATTTTCAGCCGAAGCATAAGACTGCTCA
>CRISPR_10_7784249_7784543_2 ATCAATAACAATACCTTGCTTTTCAGTTTCATT
>CRISPR_10_7784249_7784543_3 TATAACTTTCTCCTTCTATTGTTGATGTAACATA
>CRISPR_10_7784249_7784543_4 TTTTCATTTGCATCAAGTTCTTTTTCAAGGTCAA
>CRISPR_11_8822044_8822520_1 TTTACCAATCTCGGCTCTTTACTCCCGCTGGGTGCATT
>CRISPR_11_8822044_8822520_2 TTAAAGCAGATACAAAGAAGCCTTGTGAGGAATATT
>CRISPR_11_8822044_8822520_3 TATACTTCAGAAGTGCTGAGTTCCAGAAGCTTTTT
>CRISPR_11_8822044_8822520_4 AAATATATGATTAATAATAAGAATAATCAAATAGTA
>CRISPR_11_8822044_8822520_5 TTTCGTGGTTCCATCTGCTTATGAAACATTATTGATCT
>CRISPR_11_8822044_8822520_6 GGATGAGGCTGGTACATATACGTACCTGGTTCTTC
只要确保有一个叫 output.txt的或任何将其更改为文件的文件,否则异常和诸如此类的东西。
使用str.split()和正则表达式和strip()/ lstrip()/ rstrip()。 – DBedrenko 2014-09-24 13:46:14