4

在 Python 中,f.readline()返回文件的下一行f。也就是说,它从 的当前位置开始f读取,直到遇到换行符,返回中间的所有内容并更新 的位置f

现在我想做同样的事情,但是对于空格分隔的文件(不仅仅是换行符)。例如,考虑一个f包含内容的文件

token1 token2

token3                            token4


         token5

所以我正在寻找一些功能readtoken(),以便在打开后f,第一次调用f.readtoken()返回token1,第二次调用返回token2等。

为了提高效率并避免非常长的行或非常大的文件出现问题,不应该有缓冲。

我几乎可以肯定,这应该可以通过标准库“开箱即用”。但是,我没有找到任何合适的函数或方法来重新定义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()函数一一获取token:

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 回答