通过 python 中的程序识别文件内容
Identify the contents a file through a program in python
我有一个文件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 位。
您希望使用 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')
随着您深入研究,您可能需要学习很多东西,例如字符编码、数字编码(包括整数的小端编码和浮点数的浮点编码)。您需要找到一些方法来从外部验证您的结果。
祝你好运。
我有一个文件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 位。
您希望使用 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')
随着您深入研究,您可能需要学习很多东西,例如字符编码、数字编码(包括整数的小端编码和浮点数的浮点编码)。您需要找到一些方法来从外部验证您的结果。
祝你好运。