4

入力テキスト ファイルの場合、通常は .seek と .tell の両方がバイトで動作することを知っています。つまり、.seek は、指定された引数で指定されたポイントに関連して特定のバイト数をシークし、.tell はバイト数を返します。ファイルの先頭から。

私の質問は: utf-8 のような他のエンコーディングを使用する場合、これは同じように機能しますか? たとえば、utf-8 では一部の文字に数バイトが必要です。

これらのメソッドが utf-8 ファイルの解析時にバイトを処理する場合、予期しない動作が発生する可能性があるように思われます (たとえば、カーソルが文字のマルチバイト エンコーディング内で終了するか、マルチバイト文字が次のように登録される可能性があります)。数文字)。

もしそうなら、同じタスクを実行する他の方法はありますか? 特に、ファイルを解析する際に、カーソルの位置に関する情報が文字単位で必要な場合に使用します。

一方、open()関数でエンコーディングを指定すると……

infile = open(ファイル名、encoding='utf-8')

.seek と .tell の動作は変わりますか?

4

2 に答える 2

2

io.open()(組み込みの とは異なります)を使用していると仮定するとopen()、テキスト モードを使用すると a のインスタンスが取得io.TextIOされるため、これは質問に答える必要があります。

バイナリ ストレージ (ファイルなど) でのテキスト I/O は、同じストレージでのバイナリ I/O よりも大幅に遅くなります。これは、文字コーデックを使用した Unicode からバイナリ データへの変換を意味するためです。これは、膨大な量のテキスト データ (非常に大きなログ ファイルなど) を処理する場合に顕著になります。また、 TextIOWrapper.tell() と TextIOWrapper.seek()は、使用される再構築アルゴリズムが原因で、どちらも非常に遅くなります。

: また、これは seek() が文字をスキップすることを保証するものではなく、むしろ Unicode コードポイント (単一の文字は複数のコードポイントから構成される可能性があります。たとえばąu'\u0105'またはu'a\u0328'-どちらも同じ文字を出力します)。

ソース: http://docs.python.org/library/io.html#id1

于 2012-06-26T14:53:25.547 に答える
1

utf-8 エンコーディング (多数のマルチバイト文字を含むファイルで .read(1) メソッドのシークと出力を繰り返す) を使用したいくつかの実験では、はい、.seek() と .read() は utf-8 で異なる動作をすることが明らかになりました。ファイル...それらは単一バイトではなく単一文字を扱います。これは、コードのいくつかの単純な書き直し、さまざまなパターンでの読み取りとシークで構成されていました。

@satuon に感謝します。

于 2012-06-26T14:51:47.247 に答える