質問

次のファイルがあります:

abcde
kwakwa
<0x1A>
line3
linllll

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

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

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

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

役に立ちましたか?

解決

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

PythonはWindows CRT関数_wfopenを使用します。これは<!> quot; Ctrl-Z is EOF <!> quot;を実装します。セマンティクス。

他のヒント

Ned はもちろん正しい。

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

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top