2016-12-24 62 views
-2

我有一個文件here。對我來說,它似乎是一個二進制文件。這是原始文件,我相信它有OHLCV中的股票信息(開盤價,最高價,最低價,收盤價,成交量)。此外它也可能有一些文字。通過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') 

有很多的東西,你可能要學習當你深入挖掘,如字符編碼,編碼數(包括小尾數爲整數和浮點編碼浮點數)。你會想找到一些方法來外部驗證你的結果。

祝你好運。