2015-03-19 2 views
1

У меня есть текстовый файл, содержащий некоторые двоичные данные. Когда я прочитал файл, используя Python 3, в текстовом режиме я получаю UnicodeDecodeError (кодек не может декодировать байт ...) со следующими строками кода:вырезать двоичные данные из текстового файла в python

fo = open('myfile.txt, 'r') 
for line in inFile: 

Как я могу удалить двоичные данные мой файл. У меня есть заголовок, который печатается непосредственно перед каждым двоичным данным (в этом случае он отображается как Блок данных). Например, мой файл выглядит, например, где я хочу, чтобы удалить çºí ¼È × «NDI:

myfile.txt:

ABCDEFGH 
123456 
Data Block 11 
çºí?¼Èדñdí 
XYZ123 

Результат я хочу для myfile.txt, чтобы выглядеть следующим образом:

ABCDEFGH 
123456 
Data Block 11 
XYZ123 
+0

Весь текст является двоичным, на самом деле. Было бы странно иметь случайные бинарные капли, смешанные с текстом. Может быть, вы просто пытаетесь прочитать файл с неправильной кодировкой? Может быть, эти части являются «чужими» словами? – deceze

+0

Да, я согласен, что это странно, но эти файлы фактически содержат случайные бинарные капли. – SSS

+0

Вы используете Python 2 или 3? – jedwards

ответ

4

Это сложно, поскольку «двоичные» blobs могут содержать допустимые символы или последовательности символов. И если вы используете файл с текстом с использованием многобайтовой кодировки, забудьте об этом.

Если вы знаете «текст» в файле содержит только однобайтовые символы, один подход должен был бы прочитать файл в качестве байт, а затем использовать что-то вроде

encode('ascii', error='ignore') 

Это эффективно удаляет не -ASCII символы из вывода, но если вы должны были сделать это на файл, вы получите:

 
ABCDEFGH 
123456 
Data Block 
?d 
XYZ123 

Обратите внимание на втором в последнюю строку - допустимые символы ASCII были найдены в сгустке и рассматриваются как "текст".

Вы можете начать с такого решения и точно настроить его (если возможно), чтобы удовлетворить ваши потребности. Возможно, капли происходят сами по себе на линиях, так что если в строке есть любых символов не-ascii, выкиньте всю строку полностью. Возможно, вы можете посмотреть на капли и попытаться найти какую-то структуру. Может быть, вы просто согласитесь на случайные линии частичных персонажей и обработайте их каким-то образом позже. На данный момент это своего рода приложение.

Вот код, который я использовал для производства этой продукции из вашего ввода пробы:

def strip_nonascii(b): 
    return b.decode('ascii', errors='ignore') 

with open('garbled.txt', 'rb') as f: 
    for line in f: 
     print(strip_nonascii(line), end='') 
+0

Если бы блок данных должен был указывать размер двоичных данных (так как я отредактировал свое исходное сообщение, чтобы показать 11 для 11 байтов двоичных данных), это поможет лишить его? – SSS

+0

Это было бы. Если есть простой способ добраться до начала блоба (возможно, он начинается сразу после блока данных, который заканчивается новой строкой), затем 'f.seek (, 1) 'будет« пропускать »ваш указатель чтения на первый байт без blob после blob. – jedwards

-1

Если вы также колонтитул после двоичных данных (например, у вас есть заголовок), попробуйте заменить все между верхним/нижним колонтитулом с ничего с регулярным выражением?

+0

Существует нет footer per say. Хотя заголовок говорит мне, сколько байтов двоичных данных должно следовать. Я не уверен, как использовать регулярное выражение, так как единственный способ прочитать файл без ошибок - это прочитать его в двоичном режиме. – SSS

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