在某一行读取fileinput的多个文件

时间:2014-10-08 15:38:12

标签: python file-io

我有多个文件需要打开和阅读(我想可能会更容易使用fileinput.input())。这些文件最初包含非相关信息,我需要的是此特定行下面的所有信息 ID [tab] NAME [tab] GEO [tab] FEATURE (有时候从第32行开始,但不幸的是有时候在任何其他行),然后我想将它们存储在一个列表中("条目")

ID[tab]NAME[tab]GEO[tab]FEATURE
1   aa      us      A1
2   bb      ko      B1
3   cc      ve      C1
.
.
.

现在,在阅读第32行(见下面的代码)之前,我想从上面的内容中读到。是否可以使用fileinput执行此操作?或者我走错了路。有没有另一种简单的方法来做到这一点?这是我的代码,直到现在:

entries = list()

for line in fileinput.input():
    if fileinput.filelineno() > 32:
        entries.append(line.strip().split("\t"))

我试图用Python 3.2实现这个想法

更新:

以下是我的代码现在的样子,但仍然超出范围。我需要在字典中添加一些条目。我错过了什么吗?

filelist = fileinput.input()

entries = []

for fn in filelist:
    for line in fn:
        if line.strip() == "ID\tNAME\tGEO\tFEATURE":
            break
    entries.extend(line.strip().split("\t")for line in fn)

dic = collections.defaultdict(set)

for e in entries:
    dic[e[1]].add(e[3])

错误:

dic[e[1]].add(e[3])
IndexError: list index out of range

1 个答案:

答案 0 :(得分:1)

只需遍历文件,查找标记行,然后将所有内容添加到列表中。

编辑发生第二个问题是因为并非原始文件中的所有行都分成至少3个字段。例如,空行会生成一个空列表,因此e[1]无效。我已经使用嵌套迭代器更新了示例,该迭代器过滤掉了不正确大小的行。您可能想要做一些不同的事情(可能会删除空行,但另外断言剩下的行需要分成3列),但是你明白了这个想法

entries = []
for fn in filelist:
    with open('fn') as fp:
        for line in fp:
            if line.strip() == 'ID\tNAME\tGEO\tFEATURE':
                break
        #entries.extend(line.strip().split('\t') for line in fp)
        entries.extend(items for items in (line.strip().split('\t') for line in fp) if len(items) >= 3)