Программу для обработки файлов на английском языке


Моя программа анализирует файлы на английском языке. На английском языке файл просто огромный текстовый файл (около 1,5 Гб в моем случае), который выглядит так:

file=@SRR587217.1 1 length=490
NTCCGGATGATGTCGCTGTTGCTGACAATGGTAATACGTTGACGGGGCAATATGCAGTTCGCTGCATACCGGTCCGACCCCGTACTGCTCACGCAGCTTATCCAGCAGTGGCATCATTTTTTCCAGAGGCGGTCGAACTCCGCCTTCGCAAAAAAAAAGGGAGCCCGGCGGAGGAGAACGTTACTGCGGCGGAGGTTACGATTTTTCCGGTTCCGCTCCTTTAGAAGCCGGACGTCTACCCGGCTCTTTTTGCTGAACGTCAGCGTCTGAAAGAGCTGGAACGTGAAAATCGTGAACTGCGCCGCAGTAACGATATCCTTCGCCAGGCTTCCGCTTATTTTGCGAAGGCGGAGTTCGACCGCCTCTGGAAAAAATGATGCCACTGCTGGATAAGCTGCGTGAGCAGTACGGGGTCGGACCGGTATGCAGCGAACTGCATATTGCCCCGTCAACGTATTACCATTGTCAGCAACAGCGACATCATCCGGAT
+SRR587217.1 1 length=490
BT[^^^^^caccccacffffffhhhgghhhhefeggghhghghgfgggghfgggeghhhhhgggghhgggggggggggggggdgggggfffffffffffffddfffffbfffffffffffffffffffffffMFFFHOIIPHMWHOIIHHMM^IFTMFHOHIHMHWMWFMFFFTHHIIIHIOIHIIIHMFFFFFFOIIIHHIOH^IIIHMSFOIHMHMFPYIIIIIIIIFFMFMOWIIIPIHFFMOIYIII^^``^aaaccccccccffffffghghhggghghgghghhhggggefgfededbe`cgeghggegaefgghegggggggggccdggggceeggfT``dddfffdfffffac]Zbffdfdbdbdfffddd^^dfdfdfddffffdbdbdfffffffbdddf``c`b[]ccQW`MSHYbdffff]cbbdbbbdYI^bd^[WdbbbfMXbbbf^b   ^^b^bdbdddIX^d]W]QW^dd^^dcfW
@SRR587217.4 4 length=502
NTCCATGACTTCTGCACGCGTCGGCATCGGGTTAGTAATCATTGACTCCATCATCTGGGTCGCCGTGATTACCGCTCGGTTTAGCTGACGCGCACGACGGATCAACGCTTTCTGAATGCCGACCAGTTCCGGGTCGCCAATTTCCACACCGAGGTCGCCACGTGCAACCATTACCACGTCAGAGGCGAGGATGATGTCATCCATTGCATCCTGGCTGCAAACGGCTTCCGCACGTTCAACCTTGGCAACAAGTGATGCGAAAATTGTTGCCAAGGTTGAACGTGCGGAAGCCGTTTGCAGCCAGGATGCAATGGATGACATCATCCTCGCCTCTGACGTGGTAATGGTTGCACGTGGCGACCTCGGTGTGGAAATTGGCGACCCGGAACTGGTCGGCATTCAGAAAGCGTTGATCCGTCGTGCGCGTCAGCTAAACCGAGCGGTAATCACGGCGACCCAGATGATGGAGTCAATGATTACTAACCCGATGCCGACGCGTGCA
+SRR587217.4 4 length=502
BTT^^^aaccccccccffffeeggggghgggegghffghggggghhhhhhhhhhgghhhegegggdgghhgggggggggcgggffffffffffffffffffffffffffffffffffbffffffffdffffffb`fffffffffffffffffffbfffffffffffffffffffffffdfffffffffffWYbddfdddffffffffffffdfffbffffffffcW]ffff]cfddddffffffffffffd^^^^^aa`ccccccccffffffhhhghghghggggggggghgbegggfgghgeegggggghhhhhhhhhhgfghghfggbcdggggg^cceeecegeeffffeeedfffaaffdfbdbddfdfffddffffffcff[`^bfdfffffWbffddbdfffdb]dddbbfdfcfffffSWbdd^bP^db]QWcccOSWbbbddb`ffW`fff^bbI^YYbbYYYOYY^^b^^bbddbbWW]bdbQMMW]cS]dW

Каждая последовательность состоит из 4 линий. Первая строка показывает нам имя последовательности. Вторая линия показывает нам саму последовательность. Третья строка показывает нам несколько замечаний (несущественных для данного программ) и четвертая строка показывает, как качество баз в символ ASCII (результат Phred)

В первую очередь я разделить три необходимых линий (line1, line2 и line4)

Линии (названия, последовательность) сохраняются в одном списке. Две линии сохраняются в другой список, а также. В четвертой строке, преобразование символов ASCII в числа и сохранить эти цифры для каждой строки в другой список. Пример:

file=
"abcdefghijkl \n
"abcdefghijkl"
list of numbers=[[1,2,3,4,5,6,7,8][1,2,3,4,5,6,7,8]]

с тех списках я вычислить средние, медианы, дисперсии для некоторых черчения.


Код отлично работает с меньшими "тест.файлы" но если я использую большой это перегружает мой комп. Есть ли способ, чтобы сжать код? Я должен использовать менее списки/предсказывает?

def main():
    parser = ArgumentParser(prog='fastq', description=desc)
    parser.add_argument('dateien', metavar='Files', nargs='*',
                    default=['sys.stdin'], help='Input of the file')
    parser.add_argument('-p', '--phred',dest='phred',nargs=  '?',action='store',
                    choices= [33 ,64 ], required=True, type=int ) 
    parser.add_argument('-c', '--cutoff',dest = "cutoff",nargs='?',
                    action='store', default=1, type=int,
                    help='deletes whole Reads with bad quality')
    parser.add_argument('-t', '--trim',dest = 'trim',nargs='?',
                    action='store', default=1, type=int,
                    help='Trimming Readends with bad quality')
    #parser.add_argument('-v','--version',action='version', version="{prog}: {version}".format(prog=args.prog, version='0.1'))

    args = parser.parse_args()

    names = [] ; x=0 ;names1 = ""
    seq_dict={} ; mean_dict={} ; qual_dict={}
    qual_liste=[] ; i=0 ; sequenz=[] ; seq_name=[]
    mean1=[] ; summe=0
    quality_code=[]
    gc_dict={}
    qually=[]
    quality=[]
    with open('test.fastq', 'r') as seq:
      for line in seq:                
        quality_code=[]
        line=line.rstrip('\n')   
        rest=i%4                   #modulo to focus on specific lines
        i+=1                        
        #print(rest)

        if rest==0:     #line including the sequenz name
            name=line[:-13]    #some embellishment
            name1=name.strip("@")
            name2=name1.strip("length=" or "length" or "lengl" or "leng")
            name3=name2.rstrip()
            seq_name.append(name3) #List which includes lists of the seq names
        elif rest == 1:  #Line including sequenz nucleotides
            seq=line[:-args.trim] #trimming the sequenz
            sequenz.append(seq)
        elif rest ==3:    #line including quality score for sequenz
            qual=line[:-args.trim]           
            if args.phred == 33:
                quality_code=[[(ord(ii)-33) for ii in i] for i in qual.split('\n')]
            elif args.phred == 64:
                quality_code=[[(ord(ii)-64) for ii in i] for i in qual.split('\n')]
            for list in quality_code:
                mean=sum(list)/len(qual)              
            mean1.append(int(mean))    

            if mean >= int(args.cutoff):
                seq_dict[name3]=seq
                mean_dict[name3]=int(mean)   #filter/cutoff of reads with worse quality
                qual_dict[name3]=quality_code

Весь код включает еще несколько строк о заговоре, чтобы показать результаты.



Комментарии
1 ответ

Конечно, это не решит вашу проблему, но вот некоторые предложения по организации кода:


  • Вы можете использовать функции, такие как этот , чтобы принести четыре линии за раз, который я думаю, делает ваш код проще для понимания, чем использование rest:

    with open('test.fastq', 'r') as seq:
    for line1, line2, line3, line4 in group_it(4, seq):
    ...

  • Вместо того, чтобы делать if args.phred == 33: вы можете просто использовать переменную в расчет, во избежание повторения:

    quality_code=[[(ord(ii)-args.phred) for ii in i] for i in qual.split('\n')]

0
ответ дан 15 февраля 2018 в 10:02 Источник Поделиться