Итак, ваша проблема - перебирать строки файла, открытого в двоичном режиме, в котором в качестве разделителя строк используется '\r'
. Поскольку файл находится в двоичном режиме, вы не можете использовать универсальную функцию перевода строки, и получается, что '\r'
не интерпретируется как разделитель строк в двоичном режиме.
Чтение символьного файла за символом - ужасно неэффективная вещь в Python, но вот как вы можете перебирать свои строки:
def cr_lines(the_file):
line = []
while True:
byte = the_file.read(1)
if not byte:
break
line.append(byte)
if byte == '\r':
yield ''.join(line)
line = []
if line:
yield ''.join(line)
Чтобы быть более эффективным, вам нужно читать большие куски текста и обрабатывать буферизацию в вашем итераторе. Помните, что вы можете получить странные ошибки при поиске во время итерации. Для предотвращения этих ошибок потребуется подкласс файла, чтобы вы могли очистить буфер при поиске.
Обратите внимание на использование идиомы ''.join(line)
. Накопление строки с +=
имеет ужасную производительность и является распространенной ошибкой, допущенной начинающими программистами.