2015-06-14 4 views
8

Я пытаюсь читать из нескольких входных файлов и печати второй строки из каждого файла рядом друг с другом в виде таблицы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__»»

+0

Насколько я могу сказать, Python закрывает файлы в FileInput, как только они сделали - по крайней мере, документы не упоминают о необходимости закрыть их. Как таковой было бы бессмысленно использовать диспетчер контекста с fileinput, и было бы бессмысленно реализовывать '__enter__' или' __exit__' – Dannnno

+0

извините, я не вижу, как это мне помогает –

+0

Решение состоит в том, чтобы не использовать контекстный менеджер. – Dannnno

ответ

21

проблема заключается в том, что, как питона 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))        
+1

Это закрывает каждый файл? Или только последний (т. Е. Другие закрыты, когда они используются)? – Dannnno

+1

@Just_Newbie это потому, что вы используете 'proc', прежде чем определять его. Переупорядочить вещи – Dannnno

+0

Отлично! и как можно было бы получить им таблицу, то есть два столбца бок о бок? –

1

Если что-то есть 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) 
Смежные вопросы