2016-05-29 2 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 ... в элементе enumarate() 'внутри блока' try: '. Но, вероятно, было бы лучше использовать 'try:' в вашем скрипте 'importer.py', где произошла первоначальная ошибка, и попытайтесь исправить там ошибку. – C14L

Смежные вопросы