我有一个用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语句保持文件打开的任何建议吗?
感谢您的帮助。
答案 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!
# ...