我在下面的评论中解决了这个问题。
所以基本上我要做的是将字符串列表的每个元素添加到不同文件中特定行的末尾。
很难解释,但本质上我想解析一个 FASTA 文件,每次它到达标题时 (line.startswith('>')) 我希望它用列表中的元素替换该标题的一部分我'已经做了。
例如:
文件1:
">此处不需要seq1
阿塔塔塔
阿塔塔塔
>seq2 不需要的东西在这里
GTGTGTGTG
GTGTGTGTG
>seq3 更多我不想要的东西
ACACACACAC
ACACACACAC"
我希望它保留“>seq#”,但将后面的所有内容替换为下面列表中的下一项:
列表: mylist = "['things1', '', 'things3', 'things4', '' 'things6', 'things7']"
结果(修改后的文件 1):
">seq1 事物 1
阿塔塔塔
阿塔塔塔
>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 相关联,除非您确定文件每次的顺序都相同。
关于python - 将列表中的每个项目添加到 FASTA 文件中特定行的末尾,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29930050/