通过python中的程序识别文件的内容

时间:2016-12-24 13:25:18

标签: python python-3.x decode readfile

我有一个文件here。对我来说,它似乎是一个二进制文件。这是原始文件,我相信它有OHLCV(开盘价,最高价,最低价,收盘价,成交量)的库存信息。此外,它也可能有一些文字。

我可能为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位。

1 个答案:

答案 0 :(得分: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')

当您深入挖掘时,您可能需要学习很多东西,例如字符编码,数字编码(包括整数的小端和浮点数的浮点编码)。您希望找到一些外部验证结果的方法。

祝你好运。