如何在python3中跳过枚举编码异常?

时间:2016-05-29 09:51:43

标签: python-3.x codec

我制作了脚本并预处理了大型csv以便导入数据库:

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

如何跳过文件中的断行而不中断脚本流程?

2 个答案:

答案 0 :(得分:0)

通过捕获异常

来忽略异常
    try:
        .... some stuff with line ...
    except UnicodeDecodeError as e:
        pass

但如果真的是你想要的话,那将取决于具体情况。

您可以在堆栈跟踪的最后一行找到异常的名称

  

UnicodeDecodeError:' utf-16-le'编解码器不能解码位置0中的字节0x00:截断数据

答案 1 :(得分:0)

您可以将参数errors="ignore"传递给open,告诉Python您在阅读文件时不关心编码错误。

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

然而,这个可能表现得很奇怪,因为它只会跳过无效字节,而不是无效字节出现的整行。

如果您需要的行为是在解码出现任何问题时忽略整行,您可能最好以二进制模式读取文件并在try / {{1}内自行尝试解码阻止,循环内部:

except

最后一个想法是修复文件数据的任何错误,这样在阅读时就不会出现解码错误。但谁知道这有多容易。如果您从其他地方获取该文件,则无法控制,可能没有任何实用的方法可以提前修复它。