Различение пустых строк и конца файла в Python

Ситуация, с которой я постоянно сталкиваюсь, заключается в следующем:

readFile = open("myFile.txt", "r")
while True:
    readLine = readFile.readline()
    if readLine == "":
        #Assume end of file
        break
    #Otherwise, do something with the line
    #...

Проблема в том, что файл, который я читаю, содержит пустые строки. Согласно документации, которую я прочитал, file.readline() вернет "\n" для пустой строки, найденной в файле, но у меня этого не происходит. Если я не помещу это условие пустой строки в цикл while, он будет продолжаться бесконечно, потому что readline(), выполненный в конце файла или за его пределами, возвращает пустую строку.

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


person jdrobers    schedule 19.11.2014    source источник


Ответы (1)


Просто используйте цикл for:

for readLine in open("myFile.txt"):
    print(readLine); # Displayes your line contents - should also display "\n"
    # Do something more

Автоматически останавливается в конце файла.

Если вам иногда нужна дополнительная строка, что-то вроде этого может работать:

with open("myFile.txt") as f:
    for line in f:
        if needs_extra_line(line):  # Implement this yourself :-)
            line += next(f)  # Add next line to this one
        print(line)

Или генератор, который дает фрагменты, которые вы хотите использовать:

def chunks(file_object):
    for line in file_object:
        if needs_extra_line(line):
            line += next(file_object)
        yield line

Затем функция, которая обрабатывает строки, может запустить цикл for для этого генератора.

person RemcoGerlich    schedule 19.11.2014
comment
Единственная проблема, с которой я столкнулся, заключается в том, что для некоторых частей файла мне нужно прочитать две строки, чтобы собрать все нужные мне данные. Другими словами, я бы выполнил второй readline() в том же цикле. Я не уверен, смогу ли я сделать это, используя цикл for, который вы описываете. - person jdrobers; 19.11.2014
comment
Вы можете сделать это, если присвоите открытый файл переменной, а затем вызовете next(), чтобы получить следующее значение из итератора. Я отредактирую. - person RemcoGerlich; 19.11.2014
comment
@jdrobers Затем вызовите next() для файлового объекта во время цикла, если возникает ошибка StopIteration, файл достиг своего конца. - person Ashwini Chaudhary; 19.11.2014
comment
Ну, я попытался преобразовать в цикл for, и у меня возникла та же проблема. Пустые строки завершают цикл (кстати, я удалил условие разрыва, если readLine == ). Если это что-то значит, я использую Python 2.7.5. Есть ли другие обходные пути? - person jdrobers; 19.11.2014
comment
Нет, я совершенно уверен, что если вы получите пустую строку, вы на самом деле достигли конца файла. Иначе это не линия, и она бы продолжилась. Может проблема в вашем файле? - person RemcoGerlich; 20.11.2014