python 3.0 readline() случайный прыжок

Я читаю текстовый файл построчно, используя встроенную функцию python 3 readline(). Этот файл содержит информацию о сотрудниках в блоках и выглядит следующим образом:

Имя Джек \n
Фамилия Гарсия \n
Имя менеджера Смит \n
Описание это описание сотрудника \n
бла бла бла бла \n
бла бла бла бла \n
бла-бла-бла-бла. \n
Зарплата 25000\n

Мой код выглядит так:

with open(os.path.join(INPUT_FOLDER, filename)) as input_file:
    for line in input_file:
        if line.upper().startswith('DESCRIPTION'):
            description = line.split('DESCRIPTION')[1].strip()
            line = input_file.readline()
            while not line.upper().startswith('SALARY'):
                ...

Я получаю ожидаемое значение в переменной description, но когда выполняется оператор input_file.readline(), он переходит на 5 строк дальше!! Поэтому я не могу правильно завершить остальную часть описания. Что меня бесит, так это то, что я прочитал информационные блоки других сотрудников ранее в том же файле, и все работает правильно.

Я выполняю скрипт в Eclipse, используя pydev 2.7.1.

Кто-нибудь имел дело с подобной проблемой? Связано ли это с IDE, версией Python, ...?

Заранее спасибо.


person juankysmith    schedule 16.05.2013    source источник
comment
Какой код внутри блока while?   -  person Aya    schedule 16.05.2013


Ответы (2)


Вы не можете смешивать итерацию файла и readline(). В документе Встроенные типы для file.next() говорится:

«Чтобы сделать цикл for наиболее эффективным способом обхода строк файла (очень распространенная операция), метод next() использует скрытый буфер упреждающего чтения. Как следствие использования буфера упреждающего чтения , объединение next() с другими файловыми методами (такими как readline()) работает некорректно. Однако использование seek() для перемещения файла в абсолютную позицию приведет к очистке буфера упреждающего чтения».

with open(os.path.join(INPUT_FOLDER, filename)) as input_file:
    while True:
        line = input_file.readline()
        if not line:
            break
        if line.upper().startswith('DESCRIPTION'):
            description = line.split('DESCRIPTION')[1].strip()
            line = input_file.readline()
            while not line.upper().startswith(SALARY):
person tdelaney    schedule 16.05.2013

Вы сравниваете в верхнем регистре, но разбиваете на неизмененный регистр:

line.split('DESCRIPTION')

Кроме того, это

line = input_file.readline()
while not line.upper().startswith(SALARY):

кажется, не добавляется к вашей переменной описания.

Вероятно, вам нужно добавить

line = input_file.readline()
while not line.upper().startswith(SALARY):
    description += line
    line = input_file.readline()
person njzk2    schedule 16.05.2013