如何在fileinput中处理无效的utf8?

时间:2016-02-25 07:29:08

标签: python python-3.x unicode utf-8

我基本上有以下代码:

def main():
    for filename in fileinput.input():
        filename = filename.strip()
        process_file(filename)

该脚本将以换行符分隔的文件名列表作为输入。但是,某些文件名包含无效的utf8,导致fileinput.input()内爆。我已经阅读了surrogateescape错误处理程序,我认为这是我想要的,但我不知道如何为fileinput设置错误处理程序。

简而言之:如何让fileinput处理无效的Unicode?

2 个答案:

答案 0 :(得分:1)

POSIX上的

文件名可以是任意字节序列(b'\0'b'/'除外),即一般情况下没有字符编码可以解码它们(这就是为什么os.fsdecode()存在使用surrogateescape错误处理程序)。

您可以使用二进制模式读取文件名,然后如果输入不应包含它们,则跳过undecodable filenames或按原样(或os.fsdecode())传递给期望文件名的函数:

for filename in fileinput.input(mode='rb'):
    process_file(os.fsdecode(filename).strip())

请注意,有几个已知的Python错误与使用二进制模式和fileinput相关,例如:

答案 1 :(得分:0)

以下文档请使用open hook:

def main():
for filename in fileinput.input(openhook=fileinput.hook_encoded("utf-8")):
    filename = filename.strip()
    process_file(filename)