AttributeError:FileInput实例没有属性'\uu exit''

2024-06-17 13:20:29 发布

您现在位置: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__


Tags: 文件inimporttxtifwithsysline
2条回答

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

如果某物有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)

相关问题 更多 >