Сделать метод readline для Python распознавать как варианты конца строки?

Я пишу файл Python, который нужно читать в нескольких файлах разных типов. Я читаю файлы в строковой последовательности с традиционным for line in f после использования f = open("file.txt", "r").

Это не работает для всех файлов. Я предполагаю, что некоторые файлы заканчиваются разными кодировками (например,\r\n против просто \r). Я могу прочитать весь файл и разбить строку на \r, но это очень дорого, и я бы предпочел. Есть ли способ заставить метод readline Python распознавать как изменения конца строки?

Ответ 1

Используйте универсальную поддержку новой строки - см. http://docs.python.org/library/functions.html#open

В дополнение к стандартному fopen() Режим значений может быть "U" или "rU". питон обычно строится с универсальными поддержка новой строки; подача "U" файл как текстовый файл, но строки могут прекратить действие любого из следующих действий: окончательный договор Unix '\n', соглашение Macintosh '\ r', или Соглашение Windows '\ r\n'. Все эти внешние представления рассматривается как "\n" программой Python. Если Python построен без универсального Новая линия поддержки режима с 'U' является как обычный режим текста. Обратите внимание, что открытые таким образом файловые объекты также имеют атрибут, называемый новыми строками, который имеет Значение None (если новые символы еще не установлены), '\n', '\ r', '\ r\n' или кортеж, содержащий все типы новой строки видели.

Ответ 2

Вы можете попытаться использовать подход генератора для чтения строк самостоятельно и игнорировать любые символы EOL:

def readlines(f):
    line = []
    while True:
        s = f.read(1)
        if len(s) == 0:
            if len(line) > 0:
                yield line
            return
        if s in ('\r','\n'):
            if len(line) > 0:
                yield line
            line = []
        else:
            line.append(s)

for line in readlines(yourfile):
    # ...