Python readlines остановить, а затем продолжить в следующей строке - PullRequest
0 голосов
/ 24 февраля 2011

Хорошо, у меня проблема.Мне нужно прочитать строки файла с очень большим количеством строк.

Когда я нахожу результат, я останавливаюсь и выхожу из цикла, затем вызываю другую функцию.Как я могу сохранить свой «номер строки», чтобы, когда я вернусь, я просто возобновил чтение с этой строки и больше не читал все строки выше.

Хорошо, вы правы, я не совсем понялмой вопрос.

У меня есть скрипт с 2 циклами.

Первый цикл читает строку "file1" строка за строкой, и если число, которое я ищу, найдено, то я вызываю другую функцию witchсодержит второй цикл.

Я читаю оба файла с помощью:

for line in open(file_name):
    #do the stuff

Я хочу узнать значение строки и как возобновить цикл со значением строки

Файлы имеют размер более 50 тыс. Строк.

формат файла 1:

16000 hello A
17000 hello X
18000 hello Z
22000 hello X
25000 hello Y

Файл2 имеет свой формат:

имя interval_start interval_end

Моя цель - прочитать этот второй файл и проверить, находится ли число в первом цикле в любом из интервалов.И когда я нахожу это оправданием действия.

Оба файла имеют номера в порядке полумесяца.Моя проблема в том, что для каждого ключевого номера, который я нахожу в файле1, я читаю весь файл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)

Ответы [ 3 ]

3 голосов
/ 24 февраля 2011

Как сказали комментаторы, непонятно, почему вы выходите из цикла, но взгляните на встроенное перечисление .Например:

for line_num, line in enumerate(f.readlines()):
  print line_num, line
2 голосов
/ 24 февраля 2011

Самый простой способ - использовать один и тот же итератор во всех циклах. Затем, когда вы доберетесь до второго цикла, вы начнете со строки сразу после того, как другой цикл закончился в. (Непроверенный код следует ...)

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)

Хотя я согласен со всеми остальными, что вы должны попытаться поместить вызов функции в цикл, а не прерывать его. Это чище, проще и проще для понимания.

2 голосов
/ 24 февраля 2011

Это можно сделать с помощью 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']
...