2016-12-24 5 views
-2

У меня есть файл here. Мне кажется, что это двоичный файл. Это необработанный файл, и я считаю, что он имеет информацию о запасах в OHLCV (Open, High, Low, Close, Volume). Кроме того, он может также иметь некоторый текст.Определить содержимое файла через программу в python

Одна из записей, которые я мог бы иметь для OHLCV является

464.95, 468.3, 460, 465.65, 3957854 

Это код, который я попробовал. Я не полностью понимаю ASCII и Unicode.

input_file = "00063181.dat" # tata motors 
with open(input_file, "rb") as fh: 
    buf = fh.read() 
output_l = list(map(int , buf)) 
print (output_l) 

Мое сомнение: как мне декодировать этот файл и сделать из него смысл? Есть ли способ читать этот файл через программу, написанную на python, и отделять текст от int/float? Я использую Python 3 и Win 10 64 бит.

+0

Рад слышать, что вы используете Python 3. –

ответ

1

Вы хотите перепроектировать структуру двоичного файла с помощью Python. Поскольку вы заявили, что файл двоичный, это может оказаться затруднительным. Вам нужно будет изучить содержимое файла и использовать свою лучшую интуицию, чтобы попытаться вывести структуру. Первое, что вам нужно - это способ отображения каждого из байтов файла способом, который поможет вам понять смысл.

К счастью, кто-то уже написал инструмент для этого, hexdump. Установите этот пакет с помощью pip.

Функция, в которой вы нуждаетесь, это hexdump, поэтому давайте импортируем ее в пакет и получим справку по этой функции.

>>> import hexdump 
>>> help(hexdump.hexdump) 
Help on function hexdump in module hexdump: 

hexdump(data, result='print') 
    Transform binary data to the hex dump text format: 

    00000000: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 

     [x] data argument as a binary string 
     [x] data argument as a file like object 

    Returns result depending on the `result` argument: 
     'print'  - prints line by line 
     'return' - returns single string 
     'generator' - returns generator that produces lines 

Теперь вы можете начать изучение содержимого своего файла. Используйте оператор среза, чтобы сделать это в кусках. Например, для отображения содержимого первого 1KB вашего файла:

>>> hexdump.hexdump(buf[:1024]) 
00000000: C3 8E C2 8F 22 13 C2 AA 66 2A 22 47 C3 94 C3 AA ...."...f*"G.... 
00000010: C3 89 C3 A0 C3 B1 C3 91 6A C2 A4 C3 BF 3C C2 AA ........j....<.. 
00000020: C2 91 73 C3 85 46 57 47 C2 88 C3 99 C2 B6 3E 2D ..s..FWG......>- 
00000030: C3 BA 69 10 C2 93 C3 94 38 C3 81 7A 6A 43 30 7C ..i.....8..zjC0| 
00000040: C3 BB C2 AA 01 2D C2 97 C3 83 C3 88 64 14 C3 9C .....-......d... 
00000050: C2 AB C2 AA C3 A2 74 C2 85 5D C3 97 4E 64 68 C3 ......t..]..Ndh. 
... 
000003C0: 42 C2 8F 06 7F 12 33 7F 79 1E 2C 2A 0F C3 92 36 B.....3.y.,*...6 
000003D0: C3 A6 C2 96 C2 93 C2 8B 43 C2 9F 4C C2 95 48 24 ........C..L..H$ 
000003E0: C2 B3 C2 82 26 C3 88 C3 BD C3 96 12 1E 5E 18 2E ....&........^.. 
000003F0: 37 C3 A7 C2 87 C3 AE 00 4F 3F C2 9C C3 A8 1C C2 7.......O?...... 

HexDump имеет хорошее свойство делает позицию байта, шестнадцатеричный код, а затем (если это возможно) печатаемую форма символа на право.

Будем надеяться, что некоторые из ваших текстовых значений будут видны там, и это даст некоторое представление о том, как перепроектировать ваш файл.

Как только вы начали определять, как структурирован ваш файл, вы можете использовать различные строковые операторы для управления вашими данными. Например, если вы обнаружите, что ваш файл разбивается на разделы по нулевой байт (b'\x00'), вы можете получить эти участки таким образом:

>>> sections = buf.split(b'\x00') 

Есть много вещей, которые вы, вероятно, придется учиться как вы копаете глубже, как кодировки символов, кодировки чисел (в том числе little-endian для целых чисел и с плавающей запятой для чисел с плавающей запятой). Вы захотите найти какой-то способ внешне подтвердить свои результаты.

Удачи.