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

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

但在某些时候,它给了我枚举上的异常(exception):

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

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

最佳答案

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

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

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

如果您需要的行为是在解码出现任何问题时忽略整行,那么您最好以二进制模式读取文件并在 try 中自己尝试解码。/except block ,在循环内:

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

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

关于python-3.x - 如何跳过python3中的枚举编码异常?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37508463/

相关文章:

python - Kivy中如何通过函数实现到新Screen的转换?

python - 如何使用 SQLAlchemy 只创建一张表?

linear-algebra - RaptorQ FEC 实现障碍

无需转码即可修改 MP3 音频的 Python 库

c - 高效的 C 比特流实现

python - 从 CMake 运行 pytest 测试,其中测试和源位于不同的文件夹中

python - 如何清理文本数据中的\xc2\xa0\xc2\xa0.....

python - 如何使用 pandas read_csv 创建循环?

android - 如何获取Android NDK中编解码信息的角色?

Youtube 处理停留在 95%