2010-03-17 7 views
0

Мне нужно открыть несколько файлов (2 ввода и 2 выходных файла), выполнить сложные манипуляции на линиях из входных файлов, а затем добавить результаты в конце 2 выходных файлов. Настоящее время я использую следующий подход:.Работа с несколькими входными и выходными файлами в Python

in_1 = open(input_1) 
in_2 = open(input_2) 
out_1 = open(output_1, "w") 
out_2 = open(output_2, "w") 

# Read one line from each 'in_' file 
# Do many operations on the DNA sequences included in the input files 
# Append one line to each 'out_' file 

in_1.close() 
in_2.close() 
out_1.close() 
out_2.close() 

Файлы огромны (каждый потенциально приближается 1GO, поэтому я читаю через эти входные файлы в то время, я предполагаю, что это не очень Pythonic способ сделать что-то. :) Будет ли использовать следующую форму хорошо?

with open("file1") as f1: 
    with open("file2") as f2: 
     with open("file3") as f3: 
      with open("file4") as f4: 
        # Read one line from each 'in_' file 
        # Do many operations on the DNA sequences... 
        # Append one line to each 'out_' file 

Если да, то я мог сделать это, избегая при этом сильно отступом код (комментируемая часть, которая сама по себе может содержать отступом строки. Если, как это было предложено, я не использовать надлежащим образом определенные функции заранее)? Спасибо за понимание!

+0

Вы также пытаются избежать определения функций и классов? Простое определение функции разрешило бы множество проблем с вложением. Почему бы не использовать определения функций? –

+0

Также вы делаете какое-то «слияние» между двумя исходными файлами? Почему бы вам не сделать OS для вас? Команда 'sort' linux легко объединяет ваши два файла в один входной поток. –

+0

@ S.Lott Файлы содержат генетические данные, я ищу определенные шаблоны, редактируя их и записывая «исправленные» данные в выходные файлы. Процесс действительно не прямой. Часть «Выполнять некоторые операции» кода выполняется через 250 строк кода Python. Невозможно использовать быстрые и грязные команды Bash здесь :) Я определенно НЕ пытаюсь избежать определения классов и функций (есть много функций, выполняющих небольшие части задания, снова в разделе «Do some operations»). Как вы думаете, я должен использовать определение функции для решения проблем гнездования? – Morlock

ответ

5

contextlib.nested() позволяет объединять несколько менеджеров контекста в одном операторе:

with contextlib.nested(open(...), open(...), ...) as (in_1, in_2, ...): 
    .... 
+0

Вау, я каждый день узнаю что-то новое. –

+0

@Goose Bumper: Я использую Python уже 8 лет, и я все еще * изучаю новые вещи. –

+0

Мой следующий шаг на пути к улучшению моего Python ОПРЕДЕЛЕННО читает общую библиотечную документацию! Спасибо – Morlock