2016-05-29 32 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