2016-02-25 71 views
1

我基本上有以下代碼:如何處理fileinput中無效的utf8?

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

的腳本採用文件名作爲其輸入的新行分隔的列表。但是,某些文件名稱包含無效的utf8,這會導致fileinput.input()崩潰。我讀過surrogateescape錯誤處理程序,我認爲這是我想要的,但我不知道如何爲fileinput設置錯誤處理程序。

總之:我如何得到fileinput來處理無效的Unicode?

回答

1

文件名可以是字節的任意序列(除b'\0'b'/')即,沒有字符編碼可以將它們在一般情況下(進行解碼,這就是爲什麼os.fsdecode()存在使用surrogateescape錯誤處理程序)。

你可以使用二進制模式來讀取文件名,然後要麼跳過undecodable filenames如果輸入不應含有它們或將它們作爲是(或os.fsdecode())到期望的文件名功能:

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

當心,有與使用二進制模式和fileinput例如,幾個知名的Python的錯誤:

0

以下文檔請用開口鉤:上POSIX

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