2016-01-22 1 views
0

[python 3.4] Файл UTF-8, смешанный с японским и двоичным. Я пытался читать строки с кодом следующим образом:python codec readline fail при объединении unicode с двоичным кодом

line = None 
linecount = 0 
with codecs.open(destfile, 'r', 'utf-8') as fd: 
    while True: 
     try: 
      line = fd.readline() 
      linecount += 1 
     except UnicodeDecodeError: 
      continue 

     if not line: 
      break; 

    print(linecount) 

Попытки игнорировать линии с двоичным кодом, но он останавливается на строке с двоичным кодом.

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

+0

образец файла поможет получить вам лучший ответ. –

+0

Возможный дубликат [Чтение двоичных файлов и текст из того же файла в Python] (http://stackoverflow.com/questions/32659104/reading-binary-and-text-from-same-file-in-python) –

ответ

0

readline читает большие куски, декодирует и буферы. Если вы нажмете недействительный символ utf-8, вы потеряете несколько строк внутри этого недопустимого фрагмента. Чтобы усложнить ситуацию, даже если вы считаете, что некоторые данные являются двоичными, он может выглядеть как действительный utf-8 и декодировать без ошибок. Кроме того, действительно нет такой вещи, как «двоичные линии», потому что строки - это просто последовательности байтов, ограниченные байтом 0A или, возможно, 0D0A. Но они оба являются двоичными числами, поэтому, чтобы сказать, что они предназначены для прекращения линии, а не просто для того, чтобы быть частью двоичных данных.

Имея это в виду, вы можете получить в дальнейшем путем декодирования после того, как вы ломаете вещи на новой строкой:

line = None 
linecount = 0 

for line in open(destfile, 'rb'): 
    try: 
     line = line.decode('utf-8') 
     linecount += 1 
    except UnicodeDecodeError: 
     pass 
print(linecount) 
+0

спасибо за ваш быстрый ответ. Проблема здесь в том, что строки не читаются. 1000 строк в файле, но получено только 500. Это может быть вызвано EOF в двоичном коде. Как я могу обходить его, чтобы достичь реального EOF? – briantmali

+0

Потеря нескольких строк с помощью единственного 'UnicodeDecodeError' означает, что будут прочитаны меньше строк. Из 1000 линий, 500 были потеряны, потому что они оказались в кусках с открытым текстом, которые были отброшены. Нет EOF-символа, его просто ошибка, которую вы получаете, если вы читаете за конец файла, поэтому ничего не следует обойти. Я удивлен, что мой код не считал строки правильно, его целью было сделать декодирование после разделения строк, чтобы дополнительные функции не были отброшены. – tdelaney

+0

@briantmali, отправьте образец файла с требуемым выходом. –

Смежные вопросы