Python перейти к следующей строке и сохранить / редактировать контент - PullRequest
0 голосов
/ 20 октября 2011

Этот код был установлен в предыдущем посте. Я пытаюсь адаптировать его под наши данные. Но это не работает .. Вот пример нашего файла:

read:1424:2165 TGACCA/1:2165 TGACCA/2 
1..100  +chr1:3033296..3033395 #just this line
1..100  -chr1:3127494..3127395  
1..100  +chr1:3740372..3740471  

1 concordant    read:1483:2172 TGACCA/1:2172 TGACCA/2 
1..100  -chr7:94887644..94887545 #and just this line

Этот код должен делать следующее:

  1. поиск по каждой строке
  2. Распознать строку 'read:'
  3. Перейти к следующей строке и извлечь то, что выглядит как '+ chr: number..number' только раз ! Затем найдите следующее «прочитанное:» и т. Д.

Так что, если у меня есть "-chr: no..no" несколько раз после "read:", это займет только 1-е.

К сожалению, я не могу понять, как заставить это работать ...

    import re

    infile='myfile.txt'
    outfile='outfile.txt'

    pat1 = re.compile(r'read:')
    pat2 = re.compile(r'([+-])chr([^:]+):(\d+)\.\.(\d+)')

    with open(infile, mode='r') as in_f, open(outfile, mode='w') as out_f:
        for line in in_f.readlines():
            if '\t' not in line.rstrip():
                continue
            a = pat1.search(line)
            if a:
            m = pat2.search(line)
            out_f.write(' '.join(m.groups()) + '\n')
            if not a:
                continue

Вывод должен выглядеть так:

  1 3033293 3033395 
  7 94887644 94887545

Кто-нибудь киньте мне кость, пожалуйста

Обновлено с ответа ниже

Хорошо, я загружаю слегка измененную версию от Тима Макнамара, которую я использую. Это работает хорошо, но вывод не распознает число с двумя цифрами после «chr» и печатает строку после последнего числа

with open(infile, mode='r') as in_f, open(outfile, mode='w') as out_f:
    lines = [line for line in in_f.readlines()]
    for i, line in enumerate(lines):
       if 'read' in line:
            data = lines[i+1].replace(':', '..').split('..')
            try:
                out_f.write('{} {} {}\n'.format(data[1][-1], data[2], data[3])) #Here I tried to remove data[3] to avoid to have "start" in the output file.. didn't work .. 
            except IndexError:
                continue

Вот вывод, полученный с помощью этого кода:

6 140302505 140302604 start  # 'start' is a string in our data after this number
5 46605561 46605462 start    # I don't understand why it grabs it thou...
5 46605423 46605522 start    # I tried to modify the code to avoid this, but ... didn't work out
6 29908310 29908409 start
6 29908462 29908363 start
4 12712132 12712231 start

Как я могу исправить эти две ошибки?

1 Ответ

1 голос
/ 20 октября 2011

Ваша большая ошибка в том, что вам нужно включить readlines, прежде чем вы сможете выполнить итерацию над 'in_f':

with open(infile, mode='r') as in_f, open(outfile, mode='w') as out_f:
    for line in in_f.readlines():
        ...

Однако весь этот фрагмент кода, вероятно, может быть немного убран.

with open(infile, mode='r') as in_f, open(outfile, mode='w') as out_f:
    lines = [line for line in in_f.readlines()]
    for i, line in enumerate(lines):
        if 'read' in line:
            data = lines[i+1].replace(':', '..').split('..')
            try:
                a = data[1].split('chr')[-1]
                b = data[2]
                c = data[3].split()[0]
                out_f.write('{} {} {}\n'.format(a, b, c))
            except IndexError:
                pass
...