Читать предыдущую строку в файле 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)