我在下面的评论中解决了这个问题.
基本上我要做的是将字符串列表的每个元素添加到不同文件中特定行的末尾.
很难解释,但基本上我想解析一个FASTA文件,每次它到达一个标题(line.startswith(‘>’))我希望它用列表中的元素替换该标题的部分我已经制作.
例如:
文件1:
“> seq1不需要这里
AATATTATA
ATATATATA
> seq2不需要的东西在这里
GTGTGTGTG
GTGTGTGTG
> seq3我不想要的更多东西
ACACACACAC
ACACACACAC”
我希望它保留“> seq#”但用下面列表中的下一项替换所有内容:
列表:
mylist =“[‘things1′,”,’things3′,’things4′,”’things6′,’things7’]”
结果(修改后的文件1):
“> seq1 things1
AATATTATA
ATATATATA
> seq2#由于mylist [1] =”而在这里没有添加任何内容
GTGTGTGTG
GTGTGTGTG
> seq3 things3
ACACACACAC
ACACACACAC
如您所见,我希望它甚至可以添加列表中的空白项目.
所以再一次,我希望它解析这个FASTA文件,每次它到达一个标题(有数千个),我希望它在第一个单词后用我单独列表中的下一个项替换所有内容.
解决方法:
你有什么工作,但有一些不必要的线,所以我编辑下来使用少几行.另外,一个重要的注意事项是您不要关闭文件句柄.这可能会导致错误,特别是在写入文件时,无论哪种方式都是不好的做法.码:
#!/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()将注释数据与序列ID相关联,除非您确定文件每次都以相同的顺序排列.