2016-05-03 7 views
1

У меня есть двоичный файл, из которого я пытаюсь извлечь строки, и у меня есть достаточно времени. :(Python - помощь, необходимая для разбора файла. Есть ли способ игнорировать символы EOF?

Моей текущей стратегией является чтение в файле с использованием Python (с использованием одной из следующих функций: read(), readline() или readlines()). Затем я анализирую строку (char by char) и искать специальный символ «O», который в большинство случаев непосредственно следует за строками, которые я хочу! Наконец, я анализирую назад из специального полукокса записи всех символов, которые я определил как «действует.»

В конце дня мне нужна печать переднего времени и следующие 3 строки в строке.

Результаты:

В строке примера ввода # 1 функции «чтение» не будут считываться по всей строке (показано на выходном изображении). Я считаю, что это потому, что функция интерпретирует двоичный файл как символ EOF, а затем перестает читать.

В строке # 2 примера есть моменты, когда появляется «специальный символ», однако это не после строки, которую я хочу извлечь. :(

Есть ли лучший способ для анализа этих данных? Если нет, то есть способ решения проблем видели в примере строка # 1?

Примеров входных данных и результирующий вывод данные, когда я просто напечатать линии, как чтение. Как вы можете видеть, он не читает по всей линии при использовании readlines() Examples of input data and the resulting output data when I just print the lines as read. As you can see, it does not read through the entire line when using readlines()

Мой алгоритм извлечения строки, которая не очень надежен. My string extraction algorithm, which is not very robust.

FYI, эффективность не обязательно важ т.

+1

Размещая свой код как скриншот изображения, вы делаете это намного сложнее для нас, чтобы помочь вам. –

+1

Нет такой вещи, как символ EOF, EOF - это просто условие достижения конца файла. – Barmar

ответ

0

Зачем использовать Python. Используйте струны и протрите их через головку, например

strings /bin/ls | head -3 

и посмотреть, что вы получаете. Вы также можете получить строки для Windows.

+0

Кажется, это то, что я ищу. Я загружаю strings2 для окон и даю ему шанс, и кажется, что он работает хорошо! Вот вывод:
'41080, 1-Hello Comapany Здесь ?= \t Карпентер 202-Карпентер Дом Personxyz
401058, владелец площадь ООО названия компаний 213-Ingledue East names'

Как вы можете, это только перепутались 1 раз. Это то, что я думаю, что я могу очистить в python, фильтруя некоторые символы, которые, как я знаю, не будут использоваться.
Благодарим вас за предложение @Jorgen. – jindurhur

+0

Извините, что я новичок в этом:/ Кажется, это то, что я ищу. Я загружаю strings2 для окон и даю ему шанс, и кажется, что он работает хорошо! Вот результат: '41080, 1-Привет Comapany Здесь = \t Карпентер 202-Карпентер Дом Personxyz 401058, владелец площадь названия компаний ООО 213-Ingledue East names' Как вам? может, он только перепутался 1 раз. Это то, что я думаю, что я могу очистить в python, фильтруя некоторые символы, которые, как я знаю, не будут использоваться. Благодарим вас за предложение @Jorgen. – jindurhur

0

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

with open("example.tp", "b") as f: 
    data = f.read() # produces a bytes object in python 3 

Теперь разделить ваши данные на основе терминального характера

parts = data.split(b'\xf4') # f4 is hex code for your o character in latin-1 

Теперь извлечь строку из каждой части как можно лучше:

from string import ascii_letters, digits 

special_chars = '-()&, ' 
desired_chars = bytes(ascii_letters + digits + special_chars, encoding="ascii") 

data = b'0,123\xf4NOPE#Hello world\xf4ignored' # sample data 

parts = data.split(b'\xf4') 

strings = [] 
for p in parts[:-1]: # ignore last part as it is never followed by the split char 
    reversed_bytes = p[::-1] 
    # extract the string 
    for i, byte in enumerate(reversed_bytes): 
     if byte not in desired_chars: 
      chunk = reversed_bytes[:i] 
      break 
    else: 
     chunk = reversed_bytes # all chars were valid 
    bytes_ = chunk[::-1] 
    bytes_ = bytes_.replace(b',', b'') 
    strings.append(bytes_.decode("ascii")) # turn into a str 
    # use ascii codec as there should be no non-ascii bytes in your string 

print(strings) # prints ['0123', 'Hello world']