4

Python ではf.readline()、ファイルから次の行を返しますf。つまり、 の現在の位置から開始し、f改行に遭遇するまで読み取り、その間のすべてを返し、 の位置を更新しますf

今、私はまったく同じことをしたいのですが、空白で区切られたファイル(改行だけでなく)に対しても。たとえばf、コンテンツを含むファイルを考えてみましょう

token1 token2

token3                            token4


         token5

だから私はreadtoken()、開いた後、リターンfの最初の呼び出し、2番目の呼び出しがリターンなどのような関数を探しています.f.readtoken()token1token2

効率を高め、非常に長い行や非常に大きなファイルの問題を回避するために、バッファリングは行わないでください。

これは、標準ライブラリを使用して「すぐに」使用できるはずだとほぼ確信していました。ただし、適切な関数や区切り文字を再定義する方法が見つかりませんでしたreadline()

4

1 に答える 1

8

ラッパー関数を作成する必要があります。これはとても簡単です:

def read_by_tokens(fileobj):
    for line in fileobj:
        for token in line.split():
            yield token

.readline()改行が検出されるまで、ファイルを文字単位で読み取るだけではないことに注意してください。パフォーマンスを向上させるために、ファイルはブロック (バッファー) 単位で読み取られます。

上記のメソッドはファイルを行ごとに読み取りますが、結果は空白で分割されます。次のように使用します。

with open('somefilename') as f:
    for token in read_by_tokens(f):
        print(token)

はジェネレータであるためread_by_tokens()、関数の結果を直接ループするか、next()関数を使用してトークンを 1 つずつ取得する必要があります。

with open('somefilename') as f:
    tokenized = read_by_tokens(f)

    # read first two tokens separately
    first_token = next(tokenized)
    second_token = next(tokenized)

    for token in tokenized:
        # loops over all tokens *except the first two*
        print(token)
于 2013-05-06T15:59:51.087 に答える