13

私は次のファイルを持っています:

abcde
kwakwa
<0x1A>
line3
linllll

ここ<0x1A>で、は16進値が0x1Aのバイトを表します。Pythonでこのファイルを次のように読み込もうとした場合:

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

最初の2行のみを読み取り、ループを終了します。

解決策は、ファイルをバイナリ(またはユニバーサル改行モード)で開くことのようです-'rb'または'rU'。この振る舞いを説明できますか?

4

2 に答える 2

28

0x1AはCtrl-Zであり、DOSはこれまでファイルの終わりマーカーとして使用していました。たとえば、コマンドプロンプトを使用して、ファイルを「入力」してみてください。Ctrl-Zの上のコンテンツのみが表示されます。

Pythonは、「Ctrl-ZisEOF」セマンティクスを実装するWindowsCRT関数_wfopenを使用します。

于 2009-01-01T15:31:38.933 に答える
9

もちろん、ネッドは正しい。

好奇心がもう少し深まるとすれば、根本的な原因は下位互換性が極端に取り込まれていることです。Windows は DOS と互換性があり、テキスト ファイルのオプションのファイル マーカーとして Ctrl-Z を使用していました。ご存じないかもしれませんが、DOS は CP/M と互換性がありました。CP/M は、PC よりも前の小型コンピューターで一般的でした。CP/M のファイル システムは、ファイル サイズをバイト レベルまで追跡するのではなく、フロッピー ディスクのセクタ数で追跡するだけでした。ファイルが 128 バイトの正確な倍数でない場合は、テキストの終わりをマークする方法が必要でした。このウィキペディアの記事は、Ctrl-Z の選択が DEC で使用されているさらに古い規則に基づいていることを暗示しています。

于 2009-01-01T17:13:22.457 に答える