如何读取文件的第一行两次?

时间:2015-07-05 19:12:55

标签: python file iterator

我有一个包含许多行的大文件,想要先读取第一行,然后再遍历从第一行开始的所有行。

我首先想到类似的东西会这样做:

nn_vb_tagged = [(word,tag) for word, tag in tagged 
                if tag.startswith('NN') or tag.startswith('VB')]

但是这个脚本的问题是传递给file = open("fileName", 'r') first_line = file.readline() DoStuff_1(first_line) for line in file: DoStuff_2(line) file.close() 的第一行是第二行而不是第一行。我对什么样的对象DoStuff_2没有很好的直觉。我认为它是一个迭代器,并不知道如何处理它。我发现的糟糕解决方案是

file

但它非常愚蠢,并且计算成本有点高,因为它在每次迭代时运行if语句。

4 个答案:

答案 0 :(得分:4)

你可以这样做:

with open('fileName', 'r') as file:
    first_line = file.readline()
    DoStuff_1(first_line)
    DoStuff_2(first_line)

    # remaining lines
    for line in file:
        DoStuff_2(line)

请注意,我已将您的代码更改为使用with,因此file会自动关闭。

答案 1 :(得分:2)

我喜欢使用生成器来抽象你的一般控制流程。类似的东西:

def first_and_file(file_obj):
    """
    :type file_obj: file
    :rtype: (str, __generator[str])
    """
    first_line = next(file_obj)

    def gen_rest():
        yield first_line
        yield from file_obj

    return first_line, gen_rest()

在Python 2.7中,将yield from替换为:

for line in file_obj:
    yield line

答案 2 :(得分:1)

另一个答案是只打开文件两次。

with open("file.txt", "r") as r:
    Do_Stuff1(r.readline())

with open("file.txt", "r") as r:
    for line in r:
        Do_Stuff2(line)

答案 3 :(得分:0)

此问题一般情况的解决方案之一是保存您所在的行号。完成需要您相对于当前行的前一行的操作后,通过执行file.seek(0)然后使用file.readline()循环所需的次数来使用行号变量。