$ python3 parse_peak_user_log.py license_usage.bin --export ~/usage.xlsx --export-type xlsx
Traceback (most recent call last):
File "parse_peak_user_log.py", line 455, in <module>
parser.parse()
File "parse_peak_user_log.py", line 237, in parse
return self.parse_open_file(open_file)
File "parse_peak_user_log.py", line 254, in parse_open_file
if not self.parse_four_cc(open_file):
File "parse_peak_user_log.py", line 334, in parse_four_cc
four_cc = self.read_str(open_file, 4, True)
File "parse_peak_user_log.py", line 354, in read_str
return str_value.decode('utf-8')
UnicodeDecodeError: 'utf-8' codec can't decode byte 0xa5 in position 0: invalid start byte代码应该可以工作,因为我从一个不同的来源收到它,它确实工作了几天。突然之间,没有修改任何东西,我就被这个错误困住了。我试图在cygwin64或Ubuntu的帮助下运行python脚本,在这两个终端上,我都会收到相同的错误。
我不太熟悉python,但我确实理解问题的所在。我唯一不明白的是,脚本中有以下代码:
def read_str(self, open_file, length, append):
str_value = open_file.read(length)
if append:
self.log_data += str_value
return str_value.decode('utf-8')这不应该是解码问题吗?
谢谢。
发布于 2019-10-09 13:54:53
不应该是解码问题吗?
只有当您的文件实际上是在utf-8中编码时,情况就不是这样了。如果文件中的编码是"latin1“,则”\xa5 5“字节表示”元“--它主要用于世界各地,包括西部安装Windows。
如果在这些数据中“元”的存在对您来说是有意义的,那么确定该文件是用latin1编码的(类似于"cp1252",有几个字符的差异)--只需将解码行替换为:
return str_value.decode('latin1')您的代码应该适用于此文件。否则,即字符应该是另一回事,那么您必须通过其他方式猜测文件的正确编码(例如,如果文件是西里尔字母CP855,文件中相同的“\xa5 5”字节代表'Ц‘字符)。
在上述代码的另一个注意事项中--代码试图以二进制模式读取文件(假设,因为正在解码竞赛),但是,在这种情况下,没有注意字符的所有字节都没有读取。也就是说,utf-8编码中的一个字符可以有1-4字节的长度--如果"str_value“读取部分字符,则解码步骤将失败。(即使文件实际上是utf-8编码,也可能是这种情况)。正确的做法是将文件作为文本打开,并让Python编解码器处理解码步骤。
换句话说:任何代码创建的open_file都应该执行open("<filename>", "rt", encoding="latin1") (如果任何其他代码将self.log_data视为字节而不是文本,即尝试调用self.log_data.decode,则也应该进行更改(只需删除".decode“调用)
https://stackoverflow.com/questions/58303744
复制相似问题