我基本上有以下代码:
def main():
for filename in fileinput.input():
filename = filename.strip()
process_file(filename)
该脚本将以换行符分隔的文件名列表作为输入。但是,某些文件名包含无效的utf8,导致fileinput.input()
内爆。我已经阅读了surrogateescape
错误处理程序,我认为这是我想要的,但我不知道如何为fileinput设置错误处理程序。
简而言之:如何让fileinput
处理无效的Unicode? p>
答案 0 :(得分:1)
文件名可以是任意字节序列(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)