理解できない CPython の問題があります。要するに、同じコードを使用して小さなテキスト ファイルを読み取ることはできますが、20 GB の txt ファイルから 1 行も読み取れないという事実です。
役立つ情報:
- 小さいファイル ~1MB は、大きな 20GB ファイルのサブセットです (最初から 1MB)。
- 両方のファイルは、CR (\r) で区切られた幅 ~2000 文字の行を持つテキスト ファイルです。
明白な解決策:
f = open(r'filename', 'r')
for line in f:
print(line)
f.close()
動作します...しかし..短いファイルのみ。大きなものは永遠にハングアップします(または、少なくとも最初の行を印刷するのにかかる時間よりも長くなります)。
だから私は少なくとも次のような1行を読みたいと思っていました:
f = open(r'filename', 'r')
print(f.readline())
f.close()
ここで同様の状況-小さなファイルではすぐに機能しますが、かなりの時間が経過した後の大きなファイルでは、そのメッセージが吐き出されます。
Traceback (most recent call last):
File "***", line 16, in <module>
print(f.readline())
SystemError: ..\Objects\stringobject.c:3902: bad argument to internal function
大きなテキストファイルをどうやって読むべきですか?
アップデート:
人間は十分な睡眠をとっている場合、より明確に考えていることがわかりました;-)。問題は解決されました - ドキュメント内の 1 つの文を見落としていたことが判明しました。
Python は通常、普遍的な改行サポートで構築されています。'U' を指定するとファイルがテキスト ファイルとして開きますが、行は次のいずれかで終了する場合があります: Unix の行末規則 '\n'、Macintosh の規則 '\r'、または Windows の規則 '\ r\n'.
ユニバーサル改行はデフォルトで「オン」になっていると思いました。
私の上記の声明:
print(f.readline())
1行だけ読んでいましたが、部分的に間違っていました(私の悪いことです)。私の小さなファイルは、大きなファイルのチャンクを取得して作成されたと言ったことを覚えていますか? その操作中に行末が (CR) から (CRLF) に変わったので、私が見たのは最初の行でした。そのすべてが、問題は行末にあるのではない、と私に思わせました。
時間と助けてくれてありがとう。