解决 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'))