2016-05-29 15 views
1

I gestaltete Skript und vorverarbeitet großen csv zu Datenbank importieren:Wie überspringe Codierung Ausnahme in Python3 überspringen?

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: 
      ... 

Aber irgendwann gibt es mir Ausnahme auf 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 
... 

Wie unterbrochene Linien in der Datei überspringen das Skript nicht unterbrechen fließen ?

Antwort

0

Sie den Parameter errors="ignore"-open passieren finden, Python zu sagen, dass Sie nicht über Codierungsfehler egal beim Lesen aus der Datei.

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

Diese kann seltsam jedoch verhalten, da es nur das ungültige Bytes überspringt, nicht die ganze Zeile das ungültige Bytes auf auftauchte.

Wenn Sie die gesamte Zeile ignorieren müssen, wenn bei der Decodierung etwas schief geht, lesen Sie die Datei im Binärmodus und versuchen Sie, die Decodierung in Ihrem try/except Block innerhalb der Schleife durchzuführen:

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 

Eine letzte Idee ist, zu beheben, was auch immer mit Ihrer Datei Daten falsch ist, so dass Sie keine Decodierungsfehler erhalten, wenn es zu lesen. Aber wer weiß, wie einfach das ist. Wenn Sie die Datei von einem anderen Ort, außerhalb Ihrer Kontrolle, erhalten, gibt es möglicherweise keine praktische Möglichkeit, sie im Voraus zu beheben.

0

Sie ignorieren eine Ausnahme, indem sie zu kontrollieren und das Nichtstun

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

Aber es wird von der Situation abhängen, ob das wirklich ist, was Sie wollen.

Sie den Namen der Ausnahme in der letzten Zeile kann der Stack-Trace

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

+0

Dank habe ich versucht, aber in diesem Fall ist die Sache ist es auftritt während der 'enumerate' Funktion aufrufen, und die einzige mögliche Lösung, die ich sehe, ist es nicht zu verwenden ... –

+0

Sie könnten die gesamte 'für ... in enumarate() 'Block im' try: 'Block. Aber es wäre wahrscheinlich besser, 'try:' in Ihrem 'importer.py'-Skript zu verwenden, in dem der anfängliche Fehler auftritt, und versuchen Sie, den Fehler dort zu beheben. – C14L