AttributeError: экземпляр FileInput не имеет атрибута '__exit__'

Я пытаюсь читать из нескольких входных файлов и печатать вторую строку из каждого файла рядом друг с другом в виде таблицы

import sys
import fileinput

with fileinput.input(files=('cutflow_TTJets_1l.txt ', 'cutflow_TTJets_1l.txt ')) as f:
    for line in f:
        proc(line)



def proc(line):
     parts = line.split("&") # split line into parts
     if  "&" in line:    # if at least 2 parts/columns
         print parts[1] # print column 2 

Но я получаю экземпляр AttributeError: FileInput не имеет атрибута __exit__ '"

Ответ 1

Проблема заключается в том, что с python 2.7.10 модуль fileinput не поддерживает использование в качестве менеджера контекста, т.е. оператора with, поэтому вам придется самостоятельно обрабатывать последовательность. Должно работать следующее:

f = fileinput.input(files=('cutflow_TTJets_1l.txt ', 'cutflow_TTJets_1l.txt '))

for line in f:
    proc(line)

f.close()

Обратите внимание, что в последних версиях python 3 вы можете использовать этот модуль в качестве менеджера контекста.


Для второй части вопроса, считая, что каждый файл аналогично отформатирован с равным количеством строк данных формы xxxxxx & xxxxx, можно сделать таблицу данных из второго столбца каждого из данных следующим образом:

Начните с пустого списка, который будет таблицей, где строки будут списками записей второго столбца из каждого файла:

table = []

Теперь итерации по всем строкам последовательности fileinput, используя fileinput.isfirstline(), чтобы проверить, находимся ли мы в новом файле и создаем новую строку:

for line in f:
    if fileinput.isfirstline():
        row = []
        table.append(row)
    parts = line.split('&')
    if len(parts) > 1:
        row.append(parts[1].strip())

f.close()                      

Теперь table будет транспонировать то, что вы действительно хотите, каждая строка содержит записи второго столбца данной строки каждого файла. Чтобы транспонировать список, можно использовать zip, а затем перебрать по строкам транспонированную таблицу, используя метод строки join для печати каждой строки с помощью разделителя запятой (или любого другого разделителя):

for row in zip(*table):
    print(', '.join(row))                             

Ответ 2

Если что-то имеет методы open/close, используйте contextlib.closing:

import sys
import fileinput
from contextlib import closing

with closing(fileinput.input(files=('cutflow_TTJets_1l.txt ', 'cutflow_TTJets_1l.txt '))) as f:
    for line in f:
        proc(line)