我在这里有两个问题:
1)我怎么知道它是否是文件的结尾?
2)一旦你知道文件已经到了结尾,我该如何获得行号?
要获取行号,我使用以下内容。
def get_block_range (filename, lookupValue):
with open(filename, 'r') as file:
for num, line in enumerate(file, 1):
if lookupValue in line:
#print (num)
return num
答案 0 :(得分:2)
1)我怎么知道它是否是文件的结尾?
当for循环停止时,它就是文件的结尾。
2)一旦你知道文件已经到了结尾,我该如何获得行号?
只返回forloop外的最后一个num变量...
代码:
def get_block_range (filename, lookupValue):
with open(filename, 'r') as file:
for num, line in enumerate(file, 1):
if lookupValue in line:
return num
return num
这种方式函数将返回带有lookupValue的第一行的编号或总行数。
但是如果你想总是返回具有lookupValue和行总数的行的索引,你必须这样做:
import os
def get_block_range (filename, lookupValue):
"""
Returns the index of the first line that contain ``lookupValue``
and end of the file
# here the value was at line 941 and the file had 1000 lines.
>>> get_block_range('example.txt', 'example')
(941, 1000)
:rtype: tuple
"""
if not os.path.getsize(filename):
return None, 0
with open(filename, 'r') as file:
lookup_position = None
for num, line in enumerate(file, 1):
if lookup_position is None and lookupValue in line:
lookup_position = num
return lookup_position, num
答案 1 :(得分:1)
num变量仍可在循环外部访问,并包含分配给它的最后一个值,如果在循环中找不到匹配项,则为最后一行#。
def get_block_range (filename, lookupValue):
with open(filename, 'r') as f:
for num, line in enumerate(f, 1):
if lookupValue in line:
return num
return num
答案 2 :(得分:0)
如果你想要最后一个行号,你也可以利用文件对象作为它自己的迭代器:
def get_block_range (filename, lookupValue):
with open(filename, 'r') as file:
for num, line in enumerate(file, 1):
if lookupValue in line:
return num + sum(1 for _ in file), num
return num, False
# unpack the return values
end_no , val_no = get_block_range ("some_filename", "some_value")
if val_no:
# found value
else:
.....
如果您的值不匹配,则返回最后一个行号并返回False。如果你得到一个匹配sum(1 for _ in file)
将使用剩余的行,所以将它添加到当前索引将给你总行数,该函数将分别返回总量和匹配的行号。代码也将在您自己的逻辑之后的第一场比赛中停止。