質問
次のファイルがあります:
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月。
所属していません StackOverflow