Символы новой строки в файлах без кодировки ASCII - PullRequest
1 голос
/ 05 февраля 2009

Я использую Python 2.6 для чтения файла в кодировке latin2 с окончанием строки Windows ('\ r \ n').

import codecs

file = codecs.open('stackoverflow_secrets.txt', encoding='latin2', mode='rt')
line = file.readline()
print(repr(line))

выходы: u'login: yabcok\n'

file = codecs.open('stackoverflow_secrets.txt', encoding='latin2', mode='r')
line = file.readline()
print(repr(line))

или

file = codecs.open('stackoverflow_secrets.txt', encoding='latin2', mode='rb')
line = file.readline()
print(repr(line))

выходы: u'password: l1x1%Dm\r\n'

Мои вопросы:

  1. Почему текстовый режим не используется по умолчанию? Документация гласит иначе. Модуль codecs обычно используется с двоичными файлами?
  2. Почему символы новой строки не удаляются из вывода readline ()? Это раздражает и излишне.
  3. Есть ли способ указать символ новой строки для файлов, не закодированных в ASCII.

Ответы [ 2 ]

4 голосов
/ 05 февраля 2009

Вы уверены, что ваши примеры верны? Документация модуля кодеков гласит:

Примечание. Файлы всегда открываются в двоичном режиме, даже если двоичный режим не указан. Это сделано для того, чтобы избежать потери данных из-за кодирования с использованием 8-битных значений. Это означает, что при чтении и записи не выполняется автоматическое преобразование '\ n'.

В моей системе с файлом в кодировке Latin-2 и окончанием строки DOS нет разницы между «rt», «r» и «rb» (отказ от ответственности: я использую 2.5 в Linux).

В документации для open также не упоминается флаг "t", поэтому поведение кажется немного странным.

Символы новой строки не удаляются из строк, поскольку не все строки, возвращаемые readline, могут заканчиваться символами новой строки. Если файл не заканчивается новой строкой, последняя строка не содержит ни одной. (Я, очевидно, не могу придумать лучшего объяснения).

Символы новой строки не отличаются в зависимости от кодировки (по крайней мере, среди тех, которые используют ASCII для 0-127), только в зависимости от платформы. Вы можете указать «U» в режиме при открытии файла, и Python обнаружит любую форму новой строки, либо Windows, Mac или Unix.

1 голос
/ 05 февраля 2009

Режим = 'RT'

'rt' не является реальным режимом как таковым - он будет делать то же самое, что и 'r'.

Почему текстовый режим не используется по умолчанию?

См. Ответ Торстена.

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

Вместо этого вы можете думать о «универсальном режиме новой строки», который пытается разрешить работу файлов текстового режима других платформ. Хотя есть возможность передать флаг 'U' в codecs.open, учитывая документацию, как указано выше, я думаю, что это bug . Конечно, результаты будут неправильными для UTF-16 и некоторых восточноазиатских кодеков, поэтому не полагайтесь на это.

Почему символы новой строки не удаляются из вывода readline ()?

Необходимо знать, заканчивается ли последняя строка файла завершающим переводом строки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...