AttributeError:FileInput实例没有属性' __ exit __'

时间:2015-06-14 22:13:04

标签: python

我正在尝试从多个输入文件中读取并将每个文件中的第二行作为表格彼此相邻打印

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__'"

2 个答案:

答案 0 :(得分:29)

问题是,从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))                             

答案 1 :(得分:3)

如果某些内容采用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)