嵌套循环是否使文件指针前进

Does a nested loop advance the file pointer

我有以下文本文件 (file.txt):

1
2 inside
3
4 outside
5
6

当我 运行 以下代码时:

with open("file.txt") as f:
    for value in f:
        print("outer loop (value):         ",value,end="")
        if "inside" in value:
            lstItem = []
            lstItem.append(value)
            for i,value in enumerate(f):
                print("inner loop (index:value): ",i,value,end="")
                lstItem.append(value)
                if "outside" in value:
                    break
            print(),print(lstItem),print()

这是我的输出:

outer loop (value):          1
outer loop (value):          2 inside
inner loop (index:value):  0 3
inner loop (index:value):  1 4 outside

['2 inside\n', '3\n', '4 outside\n']

outer loop (value):          5
outer loop (value):          6

所以我明白为什么“2 inside”没有包含在嵌套循环输出中(它位于它的外面),但我不明白的是为什么文件指针在调用时前进到下一行内循环。

我有“2 inside”作为列表的一部分(这是我想要的),但我也希望看到“2 inside”成为内部循环输出的一部分,其索引在它旁边,但是我不知道该怎么做。我什至尝试注释掉 lstItem.append(value) 语句以查看它是否会阻止文件指针前进,但这只是从列表中排除了该值,这不是我想要什么。

基本问题是您在两个地方操纵文件指针:每个 for 循环。短语 enumerate(f) 迭代文件描述符 f。您似乎认为这将适用于已经看到的缓冲输入列表——但事实并非如此。内部循环将继续遍历文件,直到它跳出该循环。

如果您只想遍历到目前为止所看到的内容,请将输入行存储在一个列表中,然后对该列表进行遍历。

这让你感动吗?

嵌套循环使指针前进,因为您正在内部循环中迭代文件描述符。

您应该先阅读行,然后使用您的代码 f.readlines()。然后您可以迭代嵌套循环中的行。

I have "2 inside" as part of the list (which is what I want), but I also would like to see "2 inside" be part of the inner loop output with its index next to it

在进入第二个循环前简单打印出来:

    if "inside" in value:
        lstItem = []
        lstItem.append(value)
        print("inner loop (index:value): ", 0, value, end="")
        for i,value in enumerate(f, start=1):
            print("inner loop (index:value): ",i,value,end="")
            lstItem.append(value)
            if "outside" in value:
                break
        print(),print(lstItem),print()

所以现在有两个打印,第一个的索引硬编码为 0。请注意 start=1 参数已传递 enumerate(),因此它从 1 开始计数。

有两个指纹有点难看。您可以通过打印 after 完成构建 lstItem:

来稍微改进一下
    if "inside" in value:
        lstItem = []
        lstItem.append(value)
        for value in f:
            lstItem.append(value)
            if "outside" in value:
                break

        print(*('inner loop (index:value):  {} {}'.format(i, value)
                for i, value in enumerate(lstItem)), sep='')

        print(lstItem),print()

产生此输出:

outer loop (value):          1
outer loop (value):          2 inside
inner loop (index:value):  0 2 inside
inner loop (index:value):  1 3
inner loop (index:value):  2 4 outside

['2 inside\n', '3\n', '4 outside\n']

outer loop (value):          5
outer loop (value):          6