好的,我有一个问题。我需要读取具有大量行的文件的行。
当我找到结果时,我停止并退出循环,然后调用另一个函数。 我如何保存我的“行号”,所以当我回来时我只是从这一行继续阅读,我不再阅读上面的所有行。
你说得对,我的问题不明确。
我有一个带有2个循环的脚本。
第一个循环逐行读取“file1”,如果找到我正在寻找的数字,那么我调用另一个包含第二个循环的函数。
我正在阅读这两个文件:
for line in open(file_name):
#do the stuff
我想知道“line”的值以及如何使用行值
恢复循环文件非常大,超过5万行。
文件1格式:
16000 hello A
17000 hello X
18000 hello Z
22000 hello X
25000 hello Y
File2的格式为:
name interval_start interval_end
我的目标是阅读第二个文件并检查在第一个循环中找到的数字是否在任何时间间隔内。当我发现它会执行一个动作。
这两个文件都有新月订购的数字。我的问题是,对于我在file1中找到的每个键号,我读取了整个文件2。我的观点是继续读取我在file2中停留的位置,因为由于文件是新月形的,我已经读过的所有值都是我的实际键号,所以我不需要再读它们。
eg: my key numbers are 16000, 22000 and 25000
eg: of loop in file2
hello 15000 20000 #first stop, return a value
hello 20001 20050 #first resume
hello 20051 20200
hello 20201 23000 #second stop, return a value
hello 23001 24000 #resume loop (25000 won't be found i know but that's not the problem)
答案 0 :(得分:3)
正如评论者所说,目前还不清楚为什么要退出循环,但要看一下内置的enumerate。例如:
for line_num, line in enumerate(f.readlines()):
print line_num, line
答案 1 :(得分:2)
可以使用yield
假设您有一个文件sample.txt
,如下所示,您关心以keyword
开头的行:
not what you're looking for
keyword huzzah
balh balh
blah blah
other text
other lines
keyword found it
keyword hey another one
not me
forget it
keyword yes
nope
以下代码将执行您想要的操作:
def line_search():
file =open('sample.txt')
for line in file:
if line.startswith('keyword'):
yield line
all_lines = []
for line in line_search():
all_lines.append(line)
print all_lines
这会产生:
['keyword huzzah\n', 'keyword found it\n', 'keyword hey another one\n', 'keyword yes\n']
答案 2 :(得分:2)
最简单的方法是在所有循环中使用相同的迭代器。然后当你到达第二个循环时,你将在另一个循环结束后的那一行开始。 (未经测试的代码如下......)
fyle = open("input.txt")
lyne_iterator = iter(fyle)
should_do = False
for lyne in lyne_iterator :
if should_do_something_with(lyne) :
should_do = True
break
if should_do :
do_something(lyne)
# This will continue reading the file where the last loop left off.
for lyne in lyne_iterator :
do_something_else(lyne)
虽然我同意其他人的意见,你应该尝试将你的函数调用放在循环中,而不是破坏。它更干净,更简单,更容易理解。