2014-12-27 57 views
3

假設我從Python 中的套接字讀取了一些內容,並且必須將它解碼爲UTF-8。在從Python中的套接字讀取時解碼內容

我不能保留所有內容, ,所以我必須解碼它,因爲我收到並保存到文件。

可能會發生這種情況,我只接收字符的部分字節 (例如,在Python中,信號由三個字節表示爲'\ xe2 \ x82 \ xac')。

假設我只收到前兩個字節(\ xe2 \ x82),如果我試圖解碼 它,我得到'UnicodeDecodeError',如預期的那樣。

我總是可以嘗試對當前內容進行解碼,並檢查它拋出一個異常

  • 但是,如何可靠的是這種做法?
  • 如何知道或確定我是否可以解碼當前內容?
  • 如何正確使用?

感謝

回答

6

圭多的時間機器罷工一次。

>>> dec = codecs.getincrementaldecoder('utf-8')() 
>>> dec.decode('foo\xe2\x82') 
u'foo' 
>>> dec.decode('\xac') 
u'\u20ac' 
+0

它的工作原理(使用Python 2.7進行)!這個解碼器保持狀態嗎?否則,它如何知道其中已有的可用字節?內存消耗如何? 我需要在每個時間段重新創建解碼器嗎? – user2624744

+0

它可能在某處存儲未解碼的字節。使用UTF-8就意味着它最多可以存儲3個字節。 decode()的第二個參數完成當前的解碼操作,並允許你使用reset()來回收它。 –

1

如何使用的functools.partialcodecs.iterdecode的組合(如圖所示here)?

我創建了一個完整的符號文件,似乎工作如預期(的雖然不是從文件中讀取數據,如下圖所示,你會從你的插座讀):

#!/usr/bin/env python 

import codecs 
import functools 
import sys 

with open('stack70.txt', 'rb') as euro_file: 
    f_iterator = iter(functools.partial(euro_file.read, 1), '') 
    for item in codecs.iterdecode(f_iterator, 'utf-8'): 
     print "sizeof item: %s, item: %s" % (sys.getsizeof(item), item) 

免責聲明:我幾乎沒有經驗codecs,所以我不是100%肯定這會做你想做的,但(據我所知),它的確如此,對吧?

stack70.txt是充滿「歐元」符號的文件。上述輸出碼:

sizeof item: 56, item: € 
sizeof item: 56, item: € 
sizeof item: 56, item: € 
sizeof item: 56, item: € 
sizeof item: 56, item: €