在python循环中打印来自交替文件的行

时间:2018-03-01 14:44:37

标签: python bioinformatics biopython fasta fastq

我正在尝试使用python在两个单独的文件中查找感兴趣的四行块,然后按受控顺序打印出一些这些行。下面是两个输入文件和所需输出文件的示例。请注意,Input.fasta中的DNA序列与Input.fastq中的DNA序列不同,因为.fasta文件已被读取更正。

Input.fasta

>read1
AAAGGCTGT
>read2
AGTCTTTAT
>read3
CGTGCCGCT

Input.fastq

@read1
AAATGCTGT
+
'(''%$'))
@read2
AGTCTCTAT
+
&---+2010
@read3
AGTGTCGCT
+
0-23;:677

DesiredOutput.fastq

@read1
AAAGGCTGT
+
'(''%$'))
@read2
AGTCTTTAT
+
&---+2010
@read3
CGTGCCGCT
+
0-23;:677

基本上我需要序列行“AAAGGCTGT”, 来自“input.fasta”的“AGTCTTTAT”和“CGTGCCGCT”以及“input.fastq”中的所有其他行。这样可以将质量信息恢复到读取后更正的.fasta文件。

这是我最接近失败的尝试:

fastq = open(Input.fastq, "r")
fasta = open(Input.fasta, "r")

ReadIDs = []
IDs = []

with fastq as fq:
    for line in fq:
        if "read" in line:  
            ReadIDs.append(line)
            print(line.strip())
            for ID in ReadIDs:
                IDs.append(ID[1:6])
            with fasta as fa:
                for line in fa:
                    if any(string in line for string in IDs):
                        print(next(fa).strip())
            next(fq)
            print(next(fq).strip())
            print(next(fq).strip())

我认为通过尝试在同一循环中嵌套“with”调用两个不同的文件,我遇到了麻烦。这将正确打印read1所需的行,但不会继续遍历其余行并抛出错误“ValueError:对已关闭文件的I / O操作”

3 个答案:

答案 0 :(得分:3)

我建议你使用Biopython,这会为你省去很多麻烦,因为它为这些文件格式提供了很好的解析器,它不仅可以处理标准情况,还可以处理例如多行fasta。

这是一个用相应的fasta序列行替换fastq序列行的实现:

/*Error - odbc_fetch_array() expects parameter 1 to be resource, boolean given in C:\check.php on line*/

如果您不想使用标题但只依赖订单,则解决方案更简单,内存效率更高(只需确保记录的顺序和数量相同),无需定义首先是字典,只是一起遍历记录:

ORDERNUM

答案 1 :(得分:1)

我喜欢@Chris_Rands的Biopython solution更适合小文件,但这里只是使用Python附带的电池并且内存效率高的解决方案。它假定fasta和fastq文件以相同的顺序包含相同数量的读取。

/opt/elasticbeanstalk/hooks/appdeploy/post/

答案 2 :(得分:1)

## Open the files (and close them after the 'with' block ends)
with open("Input.fastq", "r") as fq, open("Input.fasta", "r") as fa:

    ## Read in the Input.fastq file and save its content to a list
    fastq = fq.readlines()

    ## Do the same for the Input.fasta file
    fasta = fa.readlines()


## For every line in the Input.fastq file
for i in range(len(fastq)):
    print(fastq[i]))
    print(fasta[2 * i])
    print(fasta[(2 * i) + 1])