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

使用python比较输入fastq文件中字符串的差异,python,fastq,sequencing,Python,Fastq,Sequencing,我想编辑一个测序Fastq文件,并删除仅在某些字符位置重复的行。理想情况下,我将迭代输入文件中的每一行,并输出一个只有一个唯一字符集实例的文件 如下图所示。我只感兴趣的是查看每行的前6个字符、后6个字符和一部分中间字符,并且只保留三个序列的每个唯一组合的一个实例 AAAAAACCCCCCCCCCCCTTTTTTTTTTCCCCCCCCAAAAAA Start by comparing to this line AAAAAACCCAAACCCCCCTTTTTTTTTTCCCCCCCCAAAA

我想编辑一个测序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行的文件,并且我正在查看chars 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的,所以不是很小。我将感谢任何帮助。谢谢。

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

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'}

(检查索引,我可能没有包括您要查找的索引)

下面是一个执行以下操作的脚本: 将每行中的元素作为一个组合字符串,对照已看到的组合字符串列表进行检查,如果是新实例,则将该行添加到列表中

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)

你在乎你保留哪种组合吗?第一,最后,随机?不,这在这种情况下没关系。感谢你的帮助,这对我很有用。但是,我无法写入输出文件。当我尝试类似于
open(output_file'w')
然后
output_file.write(line)
的操作时,我得到以下错误:
TypeError:unsupported operation type for>:“str”和“str”
谢谢这很有帮助,并且非常接近我要查找的内容。但在我看来,在dict中添加10GB文件会对RAM空间造成问题。否?如果序列足够冗余(4:1?),则可以很容易地将dict放入内存中。如果没有,我认为您有两个相对简单的选择:要么写入一个熊猫数据框,其中一列按此处键控,然后使用drop_duplicates()或将数据加载到SQL数据库中,SQLite可能是最简单的方法,然后使用它。