Как непрочитать строку в питоне - PullRequest
8 голосов
/ 01 мая 2011

Я новичок в Python (2.6), и у меня возникла ситуация, когда мне нужно не читать строку, которую я только что прочитал из файла. Вот в основном то, что я делаю.

  for line in file:
     print line
     file.seek(-len(line),1)
     zz = file.readline()
     print zz

Однако я замечаю, что "zz" и "line" не одно и то же. Куда я иду не так?

Спасибо.

Ответы [ 4 ]

12 голосов
/ 01 мая 2011

Я не думаю, что for line in file: и seek составляют хорошую комбинацию. Попробуйте что-то вроде этого:

while True:
    line = file.readline()
    print line
    file.seek(-len(line),1)
    zz = file.readline()
    print zz

    # Make sure this loop ends somehow
4 голосов
/ 01 мая 2011

Вы просто не можете смешивать итераторы и seek() таким образом. Вы должны выбрать один метод и придерживаться его.

2 голосов
/ 01 мая 2011

Вы можете объединить итерацию по строкам с помощью операции .seek():

for i, line in enumerate(iter(f.readline, ''), 1):
    print i, line,
    if i == 2: # read 2nd line two times
       f.seek(-len(line), os.SEEK_CUR)

Если файл содержит:

a
b
c

Тогда вывод будет:

1 a
2 b
3 b
4 c
1 голос
/ 02 мая 2011

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

lineCache = []

def pushLine(line):
    lineCache.append(line)

def nextLine(f):
    while True:
        if lineCache:
            yield lineCache.pop(0)
        line = f.readline()
        if not line:
            break
        yield line
    return

f = open('myfile')

for line in nextLine(f):
    # if we need to 'unread' the line, call pushLine on it.  The next call to nextLine will
    # return the that same 'unread' line.
    if some_condition_that_warrants_unreading_a_line:
        pushLine(line)
        continue
    # handle line that was read.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...