使用python比较输入fastq文件中字符串的差异

时间:2015-06-12 16:13:29

标签: python fastq sequencing

我想编辑一个测序Fastq文件,并删除仅在某些字符位置重复的行。理想情况下,我会迭代输入文件中的每一行,并输出一个只包含任何唯一字符集的单个实例的文件。

如下图所示。我只对查看前6个字符,最后6个字符以及每行的中间字符的一部分感兴趣,并且只保留三个序列的每个唯一组合的一个实例。

AAAAAACCCCCCCCCCCCTTTTTTTTTTCCCCCCCCAAAAAA    Start by comparing to this line
AAAAAACCCAAACCCCCCTTTTTTTTTTCCCCCCCCAAAAAA    1-6, 19-28, 37-42 are same, so delete
AAAAAACCCCCCCCCCCCTTTTTTTTTTCCCAAACCAAAAAA    1-6, 19-28, 37-42 are same, so delete
TTTTTTCCCCCCCCCCCCTTTTTTTTTTCCCCCCCCAAAAAA    1-6 and 36-42 are same but 37-42 are different so keep

如上例所示,如果我们取一个只包含4行的文件,而我正在查看字符1-6,19-28,37-42,则第2行和第3行将被删除,或者不输出到输出文件,因为它们在每个所需的位置都有相同的字符,但由于第4行不同,因此不会被删除。

我已经开始使用以下代码,我的想法是将每个位置设置为一个变量(但我不知道必须得到干预顺序),然​​后在我们迭代通过时对每一行进行比较输入文件。

with open(current_file, 'r') as f:
    next(f)
    for line in f:
        start = line[:6]
        end = line[-7:]

如果有帮助,这些文件也是5-10GB,所以不小。我将不胜感激任何帮助。感谢。

2 个答案:

答案 0 :(得分:1)

一种简单的方法是使用带有您想要比较的部分的键的字典。每个新实例都将覆盖最后一个实例,您将保存唯一实例。对于您给出的示例:

a = 'AAAAAACCCCCCCCCCCCTTTTTTTTTTCCCCCCCCAAAAAA'    #Start by comparing to this line
b = 'AAAAAACCCAAACCCCCCTTTTTTTTTTCCCCCCCCAAAAAA'    #1-6, 19-28, 37-42 are same, so delete
c = 'AAAAAACCCCCCCCCCCCTTTTTTTTTTCCCAAACCAAAAAA'    #1-6, 19-28, 37-42 are same, so delete
d = 'TTTTTTCCCCCCCCCCCCTTTTTTTTTTCCCCCCCCAAAAAA'    #1-6 and 36-42 are same but 37-42 are different so keep
save_dict = {}
for fastq in (a,b,c,d):
    save_dict['%s%s%s' % (fastq[:6], fastq[19:28], fastq[37:42])] = fastq

以包含

的save_dict结束
{'AAAAAACTTTTTTTTTCAAAAA': 'AAAAAACCCCCCCCCCCCTTTTTTTTTTCCCAAACCAAAAAA',
 'TTTTTTCTTTTTTTTTCAAAAA': 'TTTTTTCCCCCCCCCCCCTTTTTTTTTTCCCCCCCCAAAAAA'}

(检查索引,我可能没有包括你所追求的那些)

答案 1 :(得分:1)

这是一个执行以下操作的脚本: 将每行中的元素作为组合字符串拉出,根据它已经看到的组合字符串列表进行检查,如果是新实例,则将该行添加到列表中。

with open('path/to/file', 'r') as f:
    lineCharsList = []
    outLines = []
    for line in f:
        lineChars = line[0:6]+line[18:28]+line[36:42]
        if not (lineChars in lineCharsList):
            lineCharsList.append(lineChars)
            outLines.append(line)