2

Pythonを使用して、テキストファイルを1行ずつ読んでいます。各行は可変長です。最初の行は10文字、次の行は100文字にすることができます。言う方法はありません。現在、行ごとにfile.readline()メソッドを発行して処理し、データベースに保存しています。このメソッドは、1行の入力を保証します。ただし、これをもっと速くしたいと思います。Python file.read()メソッドを使用して一括読み取りを実行し、バッファーが行の途中で停止したときに行末の読み取り文字を保証できるようにする方法はありますか?これを処理するための最良の方法は何ですか?

4

3 に答える 3

6

これらを処理する一般的な方法は次のとおりです。

for line in fileobj:
    process(line)

read行末で終わることを実際に指定する方法はありません。あなたは何か不器用なことをすることができますfileobj.seek。基本的に、N バイトを読み取り、返された文字列の最後の改行を ( を使用してstring.rfind) 検索すると、そのバイト数を後方にシークできます。


もちろん、十分なメモリがあれば、ファイル全体を一度に読み込むことができます。

list_of_lines = fileobj.readlines()

ただし、ここで顕著なスピードアップが見られるとは確信していません。必要になる前に最適化していませんか?

于 2012-09-26T20:51:16.150 に答える
1

あなたが使用することができます..

lines = file_handle.read().split('\n')
# Or 
lines = file_handle.readlines()

での正確な動作については、ドキュメントを確認してください'\n'

于 2012-09-26T20:52:52.617 に答える
0

私がいじったエンコーダーがこれを行った方法は、そこにあるもの、または特定のチャンクサイズを読み取り、最後の改行(.rfind('\ n'))の位置をメモし、その改行までデータを処理することです。 、次に改行からチャンクの最後までリストに格納します。次のブロックを読むときは、前に読んだのをやめたのと同じ位置から読み、前の残りの文字列をその上に追加します。パフォーマンスは妥当で、安定しています。もちろん、これは逆方向にシークできないネットワークソケットの場合であり、どの方法が実際にファイルでより優れたパフォーマンスを発揮するかはわかりません。

于 2012-09-28T14:53:54.003 に答える