Вопрос

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

abcde
kwakwa
<0x1A>
line3
linllll

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

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

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

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

Это было полезно?

Решение

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

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

Другие советы

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top