проблема заключается в том, что, как питона 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))
Насколько я могу сказать, Python закрывает файлы в FileInput, как только они сделали - по крайней мере, документы не упоминают о необходимости закрыть их. Как таковой было бы бессмысленно использовать диспетчер контекста с fileinput, и было бы бессмысленно реализовывать '__enter__' или' __exit__' – Dannnno
извините, я не вижу, как это мне помогает –
Решение состоит в том, чтобы не использовать контекстный менеджер. – Dannnno