2015-09-03 5 views
0

Я работаю на файл, содержащий много биологических данных, мой входной файл выглядит,Удаления текста предшествующего данное предложения

Start 
blah 
blah 
blah 
blah 
blah 
5'UTR 
IMPORTANT STRING 
blah 
blah 
// 

Start 
blah 
blah 
blah 
5'UTR 
IMPORTANT STRING 
blah 
blah 
blah 
// 

.... и так далее это происходит около 4k раза. Теперь задача состоит в том, чтобы проверить, содержит ли важная строка «НЕТ-информация», если она удаляет весь абзац (от начала до //), если не записывает всю вещь в новый файл.

Проблема, с которой я столкнулся, заключается в том, что «5'UTR» не распознается как ключевое слово, когда я делаю, для ключевого слова в строке Также я не могу удалить весь абзац. Как я написать функциональный код питона

+3

Это не совсем ясно мне, что вы хотите делать то, и я прочитал ваш пост 5 раз уже, может быть, это только мне ... –

+1

Дать нужные пункты в новый файл довольно легко. Удаление нежелательных абзацев из вашего входного файла во время чтения происходит сложно, но я не понимаю, почему вы хотите это сделать, поскольку, когда вы закончите обработку входного файла, новый файл будет содержать только нужные абзацы. –

ответ

1

Вместо того, чтобы читать во всем файле и выполнять регулярное выражение на нем, я читал его в кусках, по одной записи за раз и yield. Выход - это способ Python эффективно оценивать последовательность по мере необходимости.

def records(stream): 
    while stream: 
     lines = [] 
     for line in stream: 
      lines.append(line) 
      if line.startswith('//'): 
       break 
     record = ''.join(lines) 
     yield record 

for record in records(data): 
    if "5'UTR\nNO information" not in record: 
     output.write(record) 
0

Следующий скрипт создаст новый файл output.txt, содержащего только те блоки, которые не имеют в NO information строки:

with open('file.txt', 'r') as f_input, open('output.txt', 'w') as f_output: 
    text = f_input.read() 
    blocks = re.findall(r"^(Start.*?^\/\/\n*)", text, re.M+re.S) 
    blocks = [block for block in blocks if re.search(r"5'UTR\n(?!NO information).*?\n", block, re.M+re.S)] 
    f_output.write("".join(blocks)) 

Для примера output.txt будут такими же как вход. Сначала он создает список всех блоков. Затем он отфильтровывает все, которые имеют NO information, а затем записывает все оставшиеся блоки в новый файл.

+0

Чтение всего файла в ОЗУ для его быстрой обработки (хотя регулярное выражение имеет тенденцию быть медленнее, чем эквивалентные методы 'str' для простых задач). Однако, если у Адвайта есть ** лот ** биологических данных для обработки, может быть неразумно читать все это сразу. –

Смежные вопросы