最近,在終端啟動Python時,報了一個錯誤:
1 Failed calling sys.__interactivehook__ 2 Traceback (most recent call last): 3 File "d:\ProgramData\Anaconda3\lib\site.py", line 439, in register_readline 4 readline.read_history_file(history) 5 File "d:\ProgramData\Anaconda3\lib\site-packages\pyreadline\rlmain.py", line 165, in read_history_file 6 self.mode._history.read_history_file(filename) 7 File "d:\ProgramData\Anaconda3\lib\site-packages\pyreadline\lineeditor\history.py", line 82, in read_history_file 8 for line in open(filename, 'r'): 9 UnicodeDecodeError: 'gbk' codec can't decode byte 0xa7 in position 2167: illegal multibyte sequence
原因是Python的終端歷史文件中包含中文,但不能正確使用gbk解碼。查看了Python歷史文件(系統用戶目錄下的.python_history),其編碼方式為“utf-8”,而”history.py”中讀取歷史文件時使用的編碼方式為“gbk”,所以會報錯。
解決方法
在history.py中使用`for line in open(filename, 'r')`來打開文件並讀取每一行,使用的是默認的編碼方式。需要根據不同文件的編碼方式傳入相應的參數值。
1. 首先檢測出要打開的文件的編碼方式。
在類中定義一個私有方法_get_encoding,作用是檢測文件的編碼方式,並返回。(需要導入chardet包)
1 def _get_encoding(self, filename=None): 2 if filename is None: 3 return 4 5 with open(filename, 'rb') as f: 6 return chardet.detect(f.read())['encoding']
2. 修改歷史文件內容的讀取
1
encoding = self._get_encoding(filename)
2
for line in open(filename, 'r', encoding=encoding):
3 self.add_history(lineobj.ReadLineTextBuffer(ensure_unicode(line.rstrip()))) 4
OK。問題解決。