Линия чтения дросселей на 0х1А - PullRequest
13 голосов
/ 01 января 2009

У меня есть следующий файл:

abcde
kwakwa
<0x1A>
line3
linllll

Где <0x1A> представляет байт с шестнадцатеричным значением 0x1A. При попытке прочитать этот файл в Python как:

for line in open('t.txt'):
    print line,

Он читает только первые две строки и выходит из цикла.

Решение, по-видимому, состоит в том, чтобы открыть файл в двоичном (или в универсальном режиме новой строки) - 'rb' или 'rU'. Можете ли вы объяснить это поведение?

Ответы [ 2 ]

28 голосов
/ 01 января 2009

0x1A - это Ctrl-Z, и DOS исторически использовала его в качестве маркера конца файла. Например, попробуйте использовать командную строку и «напечатать» ваш файл. Он будет отображать только содержимое вверх по Ctrl-Z.

Python использует функцию Windows CRT _wfopen, которая реализует семантику "Ctrl-Z is EOF".

9 голосов
/ 01 января 2009

Нед , конечно, правильно.

Если ваше любопытство проходит немного глубже, основной причиной является обратная совместимость, доведенная до крайности. Windows совместима с DOS, которая использовала Ctrl-Z в качестве дополнительного маркера конца файла для текстовых файлов. Что вы можете не знать, так это то, что DOS был совместим с CP / M, который был популярен на небольших компьютерах до ПК. Файловая система CP / M не отслеживала размеры файлов вплоть до уровня байтов, она отслеживала только количество секторов дискет. Если ваш файл не был кратным 128 байтам, вам нужен был способ отметить конец текста. Эта статья в Википедии подразумевает, что выбор Ctrl-Z был основан на еще более старом соглашении, используемом DEC.

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