我在下面的评论中解决了这个问题。
所以基本上我要做的就是将字符串列表中的每个元素添加到不同文件中特定行的末尾。
很难解释,但本质上我想解析一个FASTA文件,每次它到达一个头文件(line.startswith('>'))时,我希望它用我已经创建的列表中的一个元素替换那个头文件的一部分。
例如:
File1:
“>此处不需要seq1
AATATTATA
数据数据
seq2这里不想要的东西
GTGTGTGTG
GTGTGTGTG
seq3更多的东西我不想要
ACACACACAC
ACACACACAC“
我希望它保留">seq#“,但用下面列表中的下一项替换后面的所有内容:
列表: mylist = "'things1','','things3','things4','things6','things7'“
结果(修改后的file1):
“>序列1 things1
AATATTATA
数据数据
由于mylist1 = '‘,
seq2 #在此不添加任何内容
GTGTGTGTG
GTGTGTGTG
seq3 things3
ACACACACAC
ACACACACAC
正如您所看到的,我希望它甚至添加列表中的空白项。
所以再一次,我想让它解析这个FASTA文件,每次它到达一个头(有数千个)时,我想让它用我创建的单独列表中的下一项替换第一个单词之后的所有内容。
发布于 2015-04-29 11:57:06
您所拥有的将会工作,但是有一些不必要的行,所以我已经向下编辑以使用更少的行。另外,一个重要的注意事项是不要关闭您的文件句柄。这可能会导致错误,特别是在写入文件时,无论哪种方式,这都是不好的做法。代码:
#!/usr/bin/python
import sys
# gets list of annotations
def get_annos(infile):
with open(infile, 'r') as fh: # makes sure the file is closed properly
annos = []
for line in fh:
annos.append( line.split('\t')[5] ) # added tab as separator
return annos
# replaces extra info on each header with correct annotation
def add_annos(infile1, infile2, outfile):
annos = get_annos(infile1) # contains list of annos
with open(infile2, 'r') as f2, open(outfile, 'w') as output:
for line in f2:
if line.startswith('>'):
line_split = list(line.split()[0]) # split line on whitespace and store first element in list
line_split.append(annos.pop(0)) # append data of interest to current id line
output.write( ' '.join(line_split) + '\n' ) # join and write to file with a newline character
else:
output.write(line)
anno = sys.argv[1]
seq = sys.argv[2]
out = sys.argv[3]
add_annos(anno, seq, out)
get_annos(anno)这不是完美的,但它把事情弄清楚了一点。我可能不会使用pop()来将注释数据与序列I相关联,除非您确定文件每次的顺序都是相同的。
发布于 2015-12-13 04:22:52
python中有一个很棒的库,用于Fasta和其他DNA文件解析。这在生物信息学中是非常有用的。您还可以根据需要操作任何数据。下面是一个从the library website中摘录的简单示例
from Bio import SeqIO
for seq_record in SeqIO.parse("ls_orchid.fasta", "fasta"):
print(seq_record.id)
print(repr(seq_record.seq))
print(len(seq_record))你应该在你的屏幕上看到类似这样的东西:
gi|2765658|emb|Z78533.1|CIZ78533
Seq('CGTAACAAGGTTTCCGTAGGTGAACCTGCGGAAGGATCATTGATGAGACCGTGG...CGC', SingleLetterAlphabet())
740
...
gi|2765564|emb|Z78439.1|PBZ78439
Seq('CATTGTTGAGATCACATAATAATTGATCGAGTTAATCTGGAGGATCTGTTTACT...GCC', SingleLetterAlphabet())
592发布于 2015-04-29 08:55:21
*编辑*
我在任何人都能帮助我之前解决了这个问题。这是我的代码,有没有人能告诉我有什么不好的做法?有没有一种方法可以做到这一点而不把所有内容都写到一个新文件中?这似乎需要很长的时间/大量的内存。
#!/usr/bin/python
# Script takes unedited FASTA file, removed seq length and
# other header info, adds annotation after sequence name
# run as: $ python addanno.py testanno.out testseq.fasta out.txt
import sys
# gets list of annotations
def get_annos(infile):
f = open(infile)
list2 = []
for line in f:
columns = line.strip().split('\t')
list2.append(columns[5])
return list2
# replaces extra info on each header with correct annotation
def add_annos(infile1, infile2, outfile):
mylist = get_annos(infile1) # contains list of annos
f2 = open(infile2, 'r')
output = open(out, 'w')
for line in f2:
if line.startswith('>'):
l = line.partition(" ")
list3 = list(l)
del list3[1:]
list3.append(' ')
list3.append(mylist.pop(0))
final = ''.join(list3)
line = line.replace(line, final)
output.write(line)
output.write('\n')
else:
output.write(line)
anno = sys.argv[1]
seq = sys.argv[2]
out = sys.argv[3]
add_annos(anno, seq, out)
get_annos(anno)https://stackoverflow.com/questions/29930050
复制相似问题