我是一名分子生物学家,使用Biopython分析基因突变,我的问题是:
我有一个包含许多不同序列(数百万)的文件,其中大多数都是重复的。我需要找到重复项并丢弃它们,保留每个唯一序列的一个副本。我打算使用模块editdist来计算它们之间的编辑距离,以确定重复项是哪些,但editdist只能使用2个字符串,而不是文件。
任何人都知道如何将该模块用于文件而不是字符串?
答案 0 :(得分:2)
假设您的文件仅由每行排列一个序列的序列组成,我建议如下:
seq_file = open(#your file)
sequences = [seq for seq in seq_file]
uniques = list(set(sequences))
假设你有记忆。有几百万?
ETA:
正在阅读上面的评论(但没有评论权限) - 假设任何重复的序列ID都相同,这将有效。如果重复序列可以使用不同的序列ID,那么就知道哪个序列号首先出现,以及文件中它们之间的区别。
答案 1 :(得分:1)
如果要过滤掉完全重复的内容,可以使用set
Python内置类型。举个例子:
a = ["tccggatcc", "actcctgct", "tccggatcc"] # You have a list of sequences
s = set(a) # Put that into a set
s
等于['tccggatcc', 'actcctgct']
,没有重复。
答案 2 :(得分:1)
它必须是Python吗?
如果序列只是每行一个文本字符串,那么shell脚本将非常有效:
sort input-file-name | uniq > output-file-name
这将在32位Linux上完成高达2GB的文件。
如果您使用的是Windows,请安装GNU utils http://gnuwin32.sourceforge.net/summary.html。
答案 3 :(得分:0)
不要害怕文件! ; - )
我假设以下内容发布了一个例子:
-
filename = 'sequence.txt'
with open(filename, 'r') as sqfile:
sequences = sqfile.readlines() # now we have a list of strings
#discarding the duplicates:
uniques = list(set(sequences))
就是这样 - 通过使用pythons set-type,我们可以自动消除所有重复项。
如果你在同一行中有id和序列,如:
423401 ttacguactg
你可能想要消除像这样的ID:
sequences = [s.strip().split()[-1] for s in sequences]
with strip我们从前导空格和尾随空格中去掉字符串,并使用split我们将行/字符串分成2个组件:id和序列。 使用[-1]我们选择最后一个组件(=序列字符串)并将其重新打包到我们的序列列表中。
答案 4 :(得分:0)
我想到了四件事: