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