2013-12-17 2 views
3

я итерация файлКак игнорировать недопустимые строки в файле?

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

, когда файл содержит следующую строку

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

, который генерирует следующее исключение

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

Как я могу сделать мой сценарий игнорировать такие линии и продолжать с хорошими?

+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') 
Смежные вопросы