mycli: UnicodeDecodeError: ‘utf-8‘ codec can‘t decode byte 0xa8 in position 52: invalid start byte

错误描述

windows 上 python 环境运行 mycli 出现报错 (linux 类似错误应该也有参考价值):
UnicodeDecodeError: 'utf-8' codec can't decode byte 0xa8 in position 52: invalid start byte

Traceback (most recent call last):
  File "c:\users\laish\anaconda3\lib\runpy.py", line 194, in _run_module_as_main
    return _run_code(code, main_globals, None,
  File "c:\users\laish\anaconda3\lib\runpy.py", line 87, in _run_code
    exec(code, run_globals)
  File "C:\Users\laish\Anaconda3\Scripts\mycli.exe\__main__.py", line 7, in <module>
  File "c:\users\laish\anaconda3\lib\site-packages\click\core.py", line 829, in __call__
    return self.main(*args, **kwargs)
  File "c:\users\laish\anaconda3\lib\site-packages\click\core.py", line 782, in main
    rv = self.invoke(ctx)
  File "c:\users\laish\anaconda3\lib\site-packages\click\core.py", line 1066, in invoke
    return ctx.invoke(self.callback, **ctx.params)
  File "c:\users\laish\anaconda3\lib\site-packages\click\core.py", line 610, in invoke
    return callback(*args, **kwargs)
  File "c:\users\laish\anaconda3\lib\site-packages\mycli\main.py", line 1160, in cli
    mycli = MyCli(prompt=prompt, logfile=logfile,
  File "c:\users\laish\anaconda3\lib\site-packages\mycli\main.py", line 136, in __init__
    c = self.config = read_config_files(config_files)
  File "c:\users\laish\anaconda3\lib\site-packages\mycli\config.py", line 105, in read_config_files
    _config = read_config_file(_file, list_values=list_values)
  File "c:\users\laish\anaconda3\lib\site-packages\mycli\config.py", line 52, in read_config_file
    config = ConfigObj(f, interpolation=False, encoding='utf8',
  File "c:\users\laish\anaconda3\lib\site-packages\configobj.py", line 1229, in __init__
  File "c:\users\laish\anaconda3\lib\site-packages\configobj.py", line 1287, in _load
    content = self._handle_bom(content)
  File "c:\users\laish\anaconda3\lib\site-packages\configobj.py", line 1437, in _handle_bom
    return self._decode(infile, self.encoding)
  File "c:\users\laish\anaconda3\lib\site-packages\configobj.py", line 1517, in _decode
    infile[i] = line.decode(encoding)
UnicodeDecodeError: 'utf-8' codec can't decode byte 0xa8 in position 52: invalid start byte

错误分析

找到 configobj.py 的对应出错位置:

if encoding:
	for i, line in enumerate(infile):
        if isinstance(line, six.binary_type):
            # NOTE: The isinstance test here handles mixed lists of unicode/string
            # NOTE: But the decode will break on any non-string values
            # NOTE: Or could raise a ``UnicodeDecodeError``
            infile[i] = line.decode(encoding)

可以看到这里本身就有一个注释,要求不得有非unicode码的字符串。 报错信息说 ‘utf-8’ codec can’t decode byte 0xa8 in position 52: invalid start byte,因此我在此直接补上了一个 print(line[:60]),看看 52 个字符到底除了什么问题。

if encoding:
	for i, line in enumerate(infile):
        if isinstance(line, six.binary_type):
        
            print(line[:60]) # add this to check
            
            # NOTE: The isinstance test here handles mixed lists of unicode/string
            # NOTE: But the decode will break on any non-string values
            # NOTE: Or could raise a ``UnicodeDecodeError``
            infile[i] = line.decode(encoding)

再次运行 mycli,打印了对应的 line:
在这里插入图片描述可以看到在 “military time”后面出现了一些\xa8c的 unicode解析不了的字符。根据打印出的内容,推测这些字符串来源于 .myclirc 配置文件(按经验,好多软件都有个类似的 .xxrc 配置文件)。在用户家目录下找到这个 .myclirc 文件(不要和site_package里的 .myclirc 搞混了,那个是原型,家目录下的是本地配置的副本)。
确实找到了这一行:
在这里插入图片描述文中 0-23之间的 - 是一个我怎么也打不出来的字符,我只能复制。看来问题出在这了。
因为这里本身就是一个注释,因此怎么改也没关系,改掉应该就成了。

解决方案

  1. 到当前用户家目录下(windows是 C:\Users<username>,linux 应该就是 /home/)打开 .myclirc文件(这是隐藏文件所以得设置一下文件显示设置才看得到)
  2. 修改以下两行,把行尾的 “-” (我也打不出来)都改成正常的 -(用英文输入法)。
# \R - The current time, in 24-hour military time (0-23) 
# \r - The current time, standard 12-hour time (1-12)
  1. 再次在 python 环境下运行 mycli,成了。
    在这里插入图片描述学会了,以后报错直接 debug 源码!(?

版权声明:本文为banerye原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。