解决 fileinput 模块处理中文时的编码问题
fileinput 模块相对于 open 函数来说可以更加优雅地处理文件对象,详细信息可以自行上网查询。
通常的用法如下:
import fileinput
for line in fileinput.input(file_path):
process(line)
在文件中包含中文或者中文标点时,可能会出现以下报错:
Traceback (most recent call last):
File "D:\Python\Python37\lib\fileinput.py", line 252, in __next__
line = self._readline()
File "D:\Python\Python37\lib\fileinput.py", line 366, in _readline
return self._readline()
UnicodeDecodeError: 'gbk' codec can't decode byte 0x8c in position 76: illegal multibyte sequence
这时需要指定文件的编码格式用于读取,这个参数应当在 fileinput.input() 中通过 openhook 进行设置。
所幸 fileinput 模块中已经有现成的函数供我们调用:
def hook_encoded(encoding, errors=None):
def openhook(filename, mode):
return open(filename, mode, encoding=encoding, errors=errors)
return openhook
只要设置一下 openhook 即可:
for line in fileinput.input(file_path, openhook=fileinput.hook_encoded(encoding='utf-8'))