2013-05-06 312 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

相關問題