2016-01-22 35 views
0

[python 3.4] 有一個UTF-8文件混有日文和二進制文件。 我試圖讀取行代碼如下:Python編解碼器readline在unicode與二進制混合時失敗

line = None 
linecount = 0 
with codecs.open(destfile, 'r', 'utf-8') as fd: 
    while True: 
     try: 
      line = fd.readline() 
      linecount += 1 
     except UnicodeDecodeError: 
      continue 

     if not line: 
      break; 

    print(linecount) 

試圖忽略與二進制代碼行,但它停在二進制代碼行。

我如何可以讀取該文件正確地忽略符合二進制代碼

+0

文件的樣本將幫助你更好的答案。 –

+0

[在Python中用同一個文件讀取二進制和文本]可能的副本(http://stackoverflow.com/questions/32659104/reading-binary-and-text-from-same-file-in-python) –

回答

0

readline讀取更大的塊,解碼和緩衝。如果你點擊一個無效的utf-8字符,你將會在該無效塊中丟失多行。爲了使事情複雜化,即使你認爲某些數據是二進制的,它可能看起來像有效的utf-8並且解碼沒有錯誤。而且,實際上不存在「二進制行」這樣的事情,因爲行只是由0A字節或可能是0D0A序列分隔的字節序列。但是那些都是二進制數字,所以他們的意思是終止一行,而不是僅僅是二進制數據的一部分。

考慮到這一點,你可以通過解碼你打破的東西出來後,換行進一步得到:

line = None 
linecount = 0 

for line in open(destfile, 'rb'): 
    try: 
     line = line.decode('utf-8') 
     linecount += 1 
    except UnicodeDecodeError: 
     pass 
print(linecount) 
+0

感謝您的支持快速回答。這裏的問題是讀取的行數較少。文件中有1000行,但只有500行。它可能是由二進制代碼中的EOF引起的。我怎樣才能繞過它來達到真正的EOF? – briantmali

+0

使用單個UnicodeDecodeError釋放多行意味着將讀取更少的行。在1000條線路中,有500條因爲碰巧處於預先丟棄的預讀塊而丟失。沒有EOF字符,它只是讀取文件末尾時出現的錯誤,所以沒有任何可繞過的東西。我很驚訝我的代碼沒有正確地計算行數,它的目的是在分割行之後進行解碼,這樣附加組件不會被丟棄。 – tdelaney

+0

@briantmali,發佈一個具有所需輸出的示例文件。 –