2013-05-06 275 views
4

在Python中,f.readline()返回文件f的下一行。也就是说,它从f的当前位置开始读取,直到它遇到换行符,返回其中的所有内容并更新f的位置。Python:从类似于readline的文件中读取空格分隔的字符串

现在我想要做的完全一样,但对于空白分隔的文件(不只是换行符)。例如,考虑一个文件f与内容

token1 token2 

token3       token4 


     token5 

于是我找了一些功能readtoken(),从而打开f后的f.readtoken()回报token1第一个呼叫,第二呼叫retuns token2

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

我几乎可以肯定,这应该是可能的“开箱”与标准库。但是,我没有找到任何合适的函数或重新定义readline()的分隔符的方法。

回答

7

你需要创建一个包装函数;这是很容易的:

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() function获得令牌逐一:

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) 
+0

注意,这是一个生成器(+1),所以它的工作原理类似于'for f in line'而不是'f.readline()' – 2013-05-06 16:02:11

+0

@HenryKeiter:无论如何,你应该真的使用该文件作为迭代器,而不是使用'.readline()'调用,但是,是的。 – 2013-05-06 16:03:11

+0

当然。我只是想让它清楚,因为他具体询问'readline'。您的编辑已使我的评论多余,虽然:) – 2013-05-06 16:09:47

相关问题