Python 3.x 如何跳过python3中的枚举编码异常?

Python 3.x 如何跳过python3中的枚举编码异常?,python-3.x,codec,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: ... 但在某一点上,它给了我一个关于枚举的例外: ... File "/Users

我制作了脚本并预处理了大型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:
            ...
但在某一点上,它给了我一个关于枚举的例外:

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

如何在不中断脚本流的情况下跳过文件中的虚线

通过捕获异常和不执行任何操作来忽略异常

    try:
        .... some stuff with line ...
    except UnicodeDecodeError as e:
        pass
但如果这真的是你想要的,这将取决于情况

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

UnicodeDecodeError:“utf-16-le”编解码器无法对位置0中的字节0x00进行解码:截断的数据


您可以将参数
errors=“ignore”
传递到
open
,告诉Python在读取文件时不关心编码错误

with open(sys.argv[1], errors="ignore") as _f:
但是,这可能会表现得很奇怪,因为它只会跳过无效字节,而不会跳过显示无效字节的整行

如果您需要的行为是在解码出现任何错误时忽略整行,则最好以二进制模式读取文件,并在
try
/
中尝试自己解码,除了循环中的
块:

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

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

谢谢,我已经尝试过了,但在这种情况下,问题是它是在
枚举
函数调用期间发生的,我看到的唯一可能的解决方案是不使用它…您可以将整个
放在。。。在enumarate()中,在
块中尝试:
块。但是最好在发生初始错误的
importer.py
脚本中使用
try:
,然后尝试修复该错误。