Python读取文本文件并保持打开状态

时间:2015-07-29 23:22:39

标签: python

我有一个用Python读入的文本文件然后我确定包含特定关键字的行的行号。出于某种原因,我发现每次搜索不同的关键字时都必须打开文件。我已经尝试使用with语句来保持文件打开,但这似乎不起作用。

在下面的示例中,我找到文件中最后一行的行号以及包含字符串'Results'的第一行

with open(MyFile,'r') as f:
    lastline = sum(1 for line in f)

    for num, line in enumerate(f): 
        if 'Results' in line:
            ResultLine=num   
            break

这成功完成了第一次操作(确定最后一行),但没有后者。如果我只是打开文件两次就可以了:

f=open(MyFile, 'r')
lastline = sum(1 for line in f)

f=open(MyFile, 'r')      
for num, line in enumerate(f): 
    if 'Results' in line:
        ResultLine=num   
        break

有关为何我无法使用我的with语句保持文件打开的任何建议吗?

感谢您的帮助。

5 个答案:

答案 0 :(得分:3)

如果您想使用同一个文件,则需要回放文件指针。只需在第二次枚举之前f.seek(0)

但是,进入代码实际执行的操作后,可以优化它以在同一个循环中完成所有操作

with open(MyFile,'r') as f:
    lastline = 0
    ResultLine = None

    for num, line in enumerate(f): 
        if not ResultLine and 'Results' in line:
            ResultLine=num

    lastline = num # + 1 if you want a count; this is what you actually get 
                   # in your sample, the count, not the last line index

答案 1 :(得分:2)

with open(MyFile,'r') as f:
    lastline = sum(1 for line in f)

    ## The pointer f has reached the end of the file here
    ## Need to reset pointer back to beginning
    f.seek(0)

    for num, line in enumerate(f): 
        if 'Results' in line:
            ResultLine=num   
            break

答案 2 :(得分:2)

尝试在文件中一次性完成这两项任务:

with open(MyFile,'r') as f:
    searching = True
    for num, line in enumerate(f): 
        if searching and 'Results' in line:
            ResultLine=num
            searching = False
    lastline = num

答案 3 :(得分:1)

with创建contextmanager

当你退出范围时,上下文管理员会自动清理它们...(即关闭文件句柄)

此答案仅说明退出with语句时关闭文件句柄的原因

请参阅http://preshing.com/20110920/the-python-with-statement-by-example/以获取有关with语句和上下文管理器的更多信息(在Google搜索"文件上下文管理器&#34时出现的第一个链接;)

答案 4 :(得分:-1)

问题在于您已经有效地阅读了整个文件,所以当您转到enumerate这些行时,没有什么可以提取的。

您应该一次阅读所有行,然后评估那个

f = open(MyFile, 'r')
lines = list(f)

# operate on lines instead of f!
# ...