2013-12-17 27 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')