2013-10-26 66 views
3

我一直在研究一個將項目信息發送到服務器的python項目,雖然我發現了一些很好的代碼來讀取文件併發送,但我只能一次發送整個項目。我希望能夠一次讀取1000個字符,並循環直到文件結束。我相信這很容易,但我不確定要改變我爲改變現狀所做的改變。這也可能是由於對閱讀方法不熟悉,但我正在研究它,並沒有找到任何已經爲我澄清的信息。這就是我的工作:python一次讀取1000個文件直到文件結束?

with open(localFileTT, 'rb', 0) as f: #open the file 
    for fstr in f: 
     str.encode(fstr) 
     print(fstr) 
     if 'str' in fstr: 
      break 

我還沒有出臺網絡功能在這個代碼,因爲它是唯一的測試材料,以找出如何在同一時間只讀1000。它肯定能夠讀取整個部分,但我不知道如何改變它,以便一次只讀取部分內容。我會嘗試添加閱讀(1000),但打印空虛!我不確定閱讀是在哪裏發生的,不幸的是,迄今爲止我在網上閱讀的關於這些代碼部分內容的文章(例如with)沒有任何幫助。如果任何人都能指出我的方向,那麼我會很感激。

+1

請注意'str'是不可變的; 'str.encode(fstr)'返回一個**新的**字符串對象,但是你的代碼會丟棄這個對象。 'fstr'本身沒有改變。 –

回答

7

file.read()需要大小說法:

閱讀最多大小個字節的文件(如果少讀獲得size字節之前打EOF)。如果size參數爲負數或省略,請讀取所有數據,直到達到EOF。

可以使用,在一個循環中,與iter() function組合(具有設置爲''列爲定點第二個參數),和functools.partial()效率:

from functools import partial 

with open(localFileTT, 'rb', 0) as f: 
    for chunk in iter(partial(f.read, 1000), ''): 
     # chunk is up to 1000 characters long 

另一種方法是使用一個while循環:

with open(localFileTT, 'rb', 0) as f: 
    while True: 
     chunk = f.read(1000) 
     if not chunk: 
      # EOF reached, end loop 
      break 
     # chunk is up to 1000 characters long 

如果你已經嘗試過read(1000)找來一個空字符串回,你的文件已經在EOF在日時間。

+0

替代方案適合我。現在我只需要記住如何編碼爲字節數組併發送數據包。非常感謝! – user2828965

+0

如果發送數據塊時要小心發送流結束標記,否則服務器將不知道文件是否結束或連接斷開。並且您使用1024,2048,4096 ...不是1000,因爲一些緩衝區機制(在套接字,文件IO,服務器端)可能會更好地處理這個值。 – cox