2011-12-01 41 views
0

我必須使用python腳本將7231個字節寫入文件。在客戶端 - 服務器程序中,我的python腳本像客戶端一樣工作,並從服務器接收7231字節。如果我檢查TCP-Dump,它會顯示完整的數據。但是當我嘗試寫入文件時,我錯過了內容。將數據寫入python腳本中的文件時遇到問題

我的腳本:

def SendOnce(self, req='/gpsData=1',method="GET"): 
     conn = httplib.HTTPConnection(self.proxy) 
     self.Logresponse("\nConnection Open\n<br />") 
     conn.request(method,req) 
     Log="\nRequest Send: %s\n<br \>\n" %req 
     self.Logresponse(Log) 
     response = conn.getresponse() 
     Log = "\nResponse Code: %s\n<br \>\n" %response.status 
     self.Logresponse(Log) 
     Log = "\nSarav -- Get Header: %s \n version= %s <br \>\n"   %(response.msg,response.version) 
     self.Logresponse(Log) 
     if (response.status==200): 
      Log = response.read() 
      self.Logresponse(Log) 
     conn.close() 
     self.Logresponse("\nConnection Close\n<br \>") 
     return response 

這個 「self.Logresponse(日誌)」 被寫入文件。如果我收到1023字節,它將寫入全部內容。請幫我解釋如何編寫完整的數據。 注意:我正在寫入Hexa格式數據。

+2

請使用代碼標籤('{}'圖標)來格式化您的代碼。否則,我們不得不猜測它的結構,因爲縮進在語義上很重要。 – NPE

+5

自7K以來,「巨大」數據量? – geoffspear

+3

可能我們需要看到'Logresponse'來解決這個問題。 – mtrw

回答

3

首先,7231個字節是不完全的巨大...

有了你給了,我猜你可能會忘記拿OS的寫緩存考慮到有限的信息。在將所有內容寫入文件之前,您可能會嘗試讀取該文件。

Python通常使用系統的標準緩衝區(you can change that)。您可以減少該緩衝區,或自己強制執行一個flush

+2

對文件使用[上下文管理](http://docs.python.org/library/stdtypes.html#context-manager-types)也是一個好主意。 – Basilevs

+0

的Logresponse代碼: { DEF Logresponse(個體,響應): 消息=響應 日誌文件=打開( 「.//登錄// BSRLog.html」, 'A') logfile.write(消息) logfile.close() } – user1042979

+0

嗯,不好。 close()已經做了一個隱式flush()。這並不意味着數據必須實際上在磁盤上 - 但下一個打開()要實際上應該返回整個事情......奇怪。您可以嘗試在Logresponse中將bufsize設置爲0來打開嗎?即'open(「.//log // BSRLog.html」,'a',0)' – rwos

0

我只是猜測,它可能是.read()函數不會返回一個塊中的所有數據;你可以嘗試像這樣修改內部部分:

if (response.status==200): 
    while 1: 
     Log = response.read() 
     if not Log: 
      break 
     self.Logresponse(Log) 
+0

上面的代碼給出了語法錯誤。在哪裏適合這個break語句。它的語法錯誤:break不在迴路中 – user1042979

+0

檢查縮進; 'break'突破了while循環;這是正確的代碼。 – ondra

相關問題