2013-12-17 45 views
3

我遍歷文件如何忽略文件中的無效行?

for line in io.TextIOWrapper(readFile, encoding = 'utf8'): 

當文件包含生成以下異常

UnicodeDecodeError: 'utf-8' codec can't decode byte 0xea in position 3: invalid continuation byte

我怎樣才能讓我的腳本忽略以下行

b'"""\xea\x11"\t1664\t507\t137\t2\n' 

這樣的路線,並繼續與好的?

+0

作爲一個提示,爲什麼你首先使用'io.TextIOWrapper(readFile,...)'而不是僅僅在文本模式下使用'open' /'io.open'文件?偶爾有很好的理由這樣做,但我見過人們沒有理由...... – abarnert

+0

@abarnert原因在這裏解釋http://stackoverflow.com/questions/20601796/how-to-open-an- unicode-text-file-inside-a-zip/20603185?noredirect = 1#20603185 –

+0

好,很酷。同時...你爲什麼要跳過這樣的線路?看起來在一個任意文件中嵌入了垃圾,垃圾被線很好地分離出來的機會很渺茫,所以有一半時間你會跳過一些非終止垃圾,加上真正的一行文本。另外,很多東西都是有效的UTF-8,但完全廢話。如果你知道實際的格式是什麼,那麼正確解析它比使用這種啓發式更好。 – abarnert

回答

5

如果你真的想忽略整行,如果有任何無效字符,你將不得不知道有無效字符。這意味着你不能使用TextIOWrapper,而必須手動解碼線路。你想要做的是什麼:

for bline in readFile: 
    try: 
     line = bline.decode('utf-8') 
    except UnicodeDecodeError: 
     continue 
    # do stuff with line 

但是,請注意,這不會給你同樣的換行符行爲使用文本文件;如果你需要的話,你也需要明確這一點。

5

errors='ignore'的參數傳遞給TextIOWrapper。還有其他選項可用,如指定here

+2

問題是,這會無聲地跳過無效字符,所以它不會給你任何方法來忽略整條線(甚至不知道你想忽略哪一個)。 – abarnert

2

我想你可以通過errors參數:

io.TextIOWrapper(readfile, encoding='utf-8', errors='ignore')