如何跳过 python3 中的枚举编码异常?
how to skip enumerate encoding exception in python3?
我制作了脚本并预处理了大型 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
...
如何在不中断脚本流程的情况下跳过文件中的虚线?
您通过捕捉异常而什么都不做来忽略它
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
您可以将参数errors="ignore"
传递给open
,告诉Python您在读取文件时不关心编码错误。
with open(sys.argv[1], errors="ignore") as _f:
这 可能 表现得很奇怪,因为它只会跳过无效字节,而不是出现无效字节的整行。
如果您需要的行为是在解码出现任何问题时忽略整行,您最好以二进制模式读取文件并尝试在 try
/[= 中自行解码15=] 块,在循环内:
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
最后一个想法是修复文件数据中的任何错误,这样您在读取文件时就不会遇到解码错误。但谁知道这有多么容易。如果您从其他地方获取文件,超出您的控制范围,可能没有任何实用的方法可以提前修复它。
我制作了脚本并预处理了大型 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
...
如何在不中断脚本流程的情况下跳过文件中的虚线?
您通过捕捉异常而什么都不做来忽略它
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
您可以将参数errors="ignore"
传递给open
,告诉Python您在读取文件时不关心编码错误。
with open(sys.argv[1], errors="ignore") as _f:
这 可能 表现得很奇怪,因为它只会跳过无效字节,而不是出现无效字节的整行。
如果您需要的行为是在解码出现任何问题时忽略整行,您最好以二进制模式读取文件并尝试在 try
/[= 中自行解码15=] 块,在循环内:
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
最后一个想法是修复文件数据中的任何错误,这样您在读取文件时就不会遇到解码错误。但谁知道这有多么容易。如果您从其他地方获取文件,超出您的控制范围,可能没有任何实用的方法可以提前修复它。