2016-05-29 33 views
1

我製作的腳本和預處理大的CSV導入到數據庫:如何在python3中跳過枚舉編碼異常?

with open(sys.argv[1], encoding='utf-16') as _f: 
    for i, line in enumerate(_f): 
     try: 
      .... some stuff with line ... 
     except Exception as e: 
      ... 

但在某些時候它給了我異常的enumerate

... 
    File "/Users/elajah/PycharmProjects/untitled1/importer.py", line 94, in main 
    for i, line in enumerate(_f): 
    File "/Library/Frameworks/Python.framework/Versions/3.4/lib/python3.4/codecs.py", line 319, in decode 
    (result, consumed) = self._buffer_decode(data, self.errors, final) 
    File "/Library/Frameworks/Python.framework/Versions/3.4/lib/python3.4/encodings/utf_16.py", line 69, in _buffer_decode 
    return self.decoder(input, self.errors, final) 
UnicodeDecodeError: 'utf-16-le' codec can't decode byte 0x00 in position 0: truncated data 
... 

如何跳過虛線文件不中斷腳本流 ?

回答

0

您可以將參數傳遞給errors="ignore"open,來告訴Python在閱讀的時候,你不關心編碼錯誤從文件中。

with open(sys.argv[1], errors="ignore") as _f: 

可以行爲古怪,但是由於它只是跳過無效字節,而不是整個行無效字節露面上。

如果您需要的行爲是忽略整行,如果解碼出現任何問題,最好在二進制模式下讀取文件,並在循環內的try/except塊內自行嘗試解碼:

with open(sys.argv[1], 'b') as _f: 
    for i, line_bytes in enumerate(_f): 
     try: 
      line = line_bytes.decode('utf-16') 
      # do some stuff with line ... 
     except UnicodeDecodeError: 
      pass 

最後一個想法是解決什麼是錯文件的數據,以便閱讀時,你沒有得到的解碼錯誤。但誰知道這是多麼容易。如果你從其他地方獲取文件,那麼可能沒有任何實際的方法可以提前修復它。

0

您可以通過捕獲它忽視了一個異常,無所事事

try: 
     .... some stuff with line ... 
    except UnicodeDecodeError as e: 
     pass 

但它會視情況而定,如果這是你想要真的是。

您可以在堆棧跟蹤的最後一行找到了異常的名稱

UnicodeDecodeError: 'utf-16-le' codec can't decode byte 0x00 in position 0: truncated data

+0

謝謝我試過這個,但在這種情況下,事情是在'enumerate'函數調用過程中發生的,唯一可行的解​​決方案是我看不到使用它... –

+0

你可以把整個'for ...在「try:」塊內的enumarate()塊中。但是,在你的'importer.py'腳本中使用'try:'可能會更好,在那裏發生初始錯誤,並嘗試修復那裏的錯誤。 – C14L