Читать предыдущую строку в файле python

мне нужно получить значение предыдущей строки в файле и сравнить его с текущей строкой, когда я перебираю файл. Файл огромен, поэтому я не могу прочитать его целиком или случайно получить доступ к номеру строки с linecache потому что функция библиотеки все равно читает весь файл в память.

редактировать мне так жаль, что я забыл упомянуть, что я должен прочитать файл назад.

EDIT2

Я пробовал следующий:

 f = open("filename", "r")
 for line in reversed(f.readlines()): # this doesn't work because there are too many lines to read into memory

 line = linecache.getline("filename", num_line) # this also doesn't work due to the same problem above. 

3 ответов


просто сохраните предыдущее при итерации к следующему

prevLine = ""
for line in file:
    # do some work here
    prevLine = line

это сохранит предыдущую строку в prevLine во время цикла

редактировать по-видимому, OP должен прочитать этот файл назад:

aaand после часа исследований я не смог несколько раз сделать это в пределах ограничений памяти

здесь вы идете Лим, этот парень знает, что он делает, вот его лучшая идея:

общий подход #2: прочитайте весь файл, сохраните положение строк

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

Whever вы хотите прочитать строку X, вы должны перечитывать линия файл, начиная с позиции, которую вы сохранили для начала этой строки.

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


@Lim, вот как я бы это написал (ответ на комментарии)

def do_stuff_with_two_lines(previous_line, current_line):
    print "--------------"
    print previous_line
    print current_line

my_file = open('my_file.txt', 'r')

if my_file:
    current_line = my_file.readline()

for line in my_file:

    previous_line = current_line
    current_line = line

    do_stuff_with_two_lines(previous_line, current_line)

Я бы написал простой генератор для задачи:

def pairwise(fname):
    with open(fname) as fin:
        prev = next(fin)
        for line in fin:
            yield prev,line
            prev = line

или, вы можете использовать pairwise рецепт itertools:

def pairwise(iterable):
    "s -> (s0,s1), (s1,s2), (s2, s3), ..."
    a, b = itertools.tee(iterable)
    next(b, None)
    return itertools.izip(a, b)