3

我是一名分子生物学家,使用 Biopython 分析基因突变,我的问题是:

我有一个包含许多不同序列(数百万)的文件,其中大部分是重复的。我需要找到重复项并丢弃它们,为每个唯一序列保留一份副本。我打算使用模块 editdist 来计算它们之间的编辑距离,以确定哪些是重复项,但 editdist 只能处理 2 个字符串,而不是文件。

任何人都知道我如何将该模块与文件而不是字符串一起使用?

4

5 回答 5

2

假设您的文件仅由每行排列一个序列的序列组成,我建议如下:

seq_file = open(#your file)

sequences = [seq for seq in seq_file]

uniques = list(set(sequences))

假设你有它的记忆。几百万?

预计到达时间:

正在阅读上面的评论(但没有评论权限)-假设任何重复项的序列 ID 相同,这将起作用。如果重复序列可以有不同的序列 ID,那么就会知道文件中哪个先出现,它们之间是什么。

于 2012-07-12T20:29:49.557 回答
1

如果要过滤掉完全重复的内容,可以使用setPython 内置类型。举个例子 :

a = ["tccggatcc", "actcctgct", "tccggatcc"] # You have a list of sequences
s = set(a) # Put that into a set

s然后等于['tccggatcc', 'actcctgct'],没有重复。

于 2012-07-12T20:25:49.467 回答
1

它必须是Python吗?

如果序列只是每行一个的文本字符串,那么 shell 脚本将非常有效:

sort input-file-name | uniq > output-file-name

这将在 32 位 Linux 上处理高达 2GB 的文件。

如果您在 Windows 上,请安装 GNU utils http://gnuwin32.sourceforge.net/summary.html

于 2012-09-11T12:23:48.367 回答
0

想到四件事:

  1. 如 FX 所述,您可以使用 set() - 假设唯一的字符串都适合内存
  2. 您可以每个序列使用一个文件,并将文件提供给 equivs3e 之类的程序:http: //stromberg.dnsalias.org/~strombrg/equivalence-classes.html#python-3e
  3. 您也许可以将 gdbm 用作一个集合,而不是通常的键值存储使用。如果您需要 100% 准确的东西,这很好,但是您有太多数据无法容纳虚拟内存中的所有唯一性。
  4. 如果您有大量的字符串要检查并且有大量重复项,您也许可以使用布隆过滤器将数据缩减到更易于管理的大小。基本上布隆过滤器可以说“这绝对不在集合中”或“这几乎肯定在集合中”。这样,您可以在使用更常见的方式对剩余元素进行操作之前消除大部分明显的重复项。 http://stromberg.dnsalias.org/~strombrg/drs-bloom-filter/
于 2012-07-12T20:35:47.670 回答
0

不要害怕文件!;-)

我通过假设以下内容发布一个示例:

  1. 它是一个文本文件
  2. 每行一个序列

-

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] 我们选择最后一个组件(= 序列字符串)并将其重新打包到我们的序列列表中。

于 2012-07-12T20:29:37.673 回答