Python二进制文件?到文本/字符串

Python二进制文件?到文本/字符串,python,parsing,Python,Parsing,我试图在Python中将一个可能的二进制文件解析为文本/字符串。我不确定文件格式,所以我假设它是二进制的。基本上,它是从MSregedit导出的密钥(*.reg)。如果我在Notepad++中打开该键,我可以轻松阅读。但是,如果我尝试在python(特别是iPython笔记本)中迭代这些行,它会打印gobbledygook。以下是一个示例: InFile = open("F:\Uninstallkey.reg","r") for line in InFile: print "%r" %

我试图在Python中将一个可能的二进制文件解析为文本/字符串。我不确定文件格式,所以我假设它是二进制的。基本上,它是从MS
regedit
导出的密钥(*.reg)。如果我在
Notepad++
中打开该键,我可以轻松阅读。但是,如果我尝试在python(特别是iPython笔记本)中迭代这些行,它会打印gobbledygook。以下是一个示例:

InFile = open("F:\Uninstallkey.reg","r")

for line in InFile:
    print "%r" % (line)

InFile.close()
输出:

'\xff\xfeW\x00i\x00n\x00d\x00o\x00w\x00s\x00 \x00R\x00e\x00g\x00i\x00s\x00t\x00r\x00y\x00 \x00E\x00d\x00i\x00t\x00o\x00r\x00 \x00V\x00e\x00r\x00s\x00i\x00o\x00n\x00 \x005\x00.\x000\x000\x00\r\x00\n'
'\x00\r\x00\n'
'\x00[\x00H\x00K\x00E\x00Y\x00_\x00L\x00O\x00C\x00A\x00L\x00_\x00M\x00A\x00C\x00H\x00I\x00N\x00E\x00\\\x00S\x00O\x00F\x00T\x00W\x00A\x00R\x00E\x00\\\x00M\x00i\x00c\x00r\x00o\x00s\x00o\x00f\x00t\x00\\\x00W\x00i\x00n\x00d\x00o\x00w\x00s\x00\\\x00C\x00u\x00r\x00r\x00e\x00n\x00t\x00V\x00e\x00r\x00s\x00i\x00o\x00n\x00\\\x00U\x00n\x00i\x00n\x00s\x00t\x00a\x00l\x00l\x00]\x00\r\x00\n'
'\x00\r\x00\n'
在记事本++中:

Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall]
奇怪的是,在iPython中,它可以正确打印:

Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall]

长话短说,我如何知道文件格式,如何转换文件,以便将其打印/解析为文本?

该文件似乎是一个纯文本文件,仅以小尾端编码。不要使用正常的
打开
功能,而是使用
编码
参数
“UTF-16LE”

打开文件。如上所述,文件是UTF-16格式的。以下是使用编码打开文件的简单方法:

import codecs
InFile = codecs.open(path_to_registry, encoding='utf-16')

真正地解码为16LE会导致:
✊✊嬀䠀䬀䔀夀开䰀伀䌀䄀䰀开䴀䄀䌀䠀䤀一䔀尀匀伀䘀吀圀䄀刀䔀尀䴀椀挀爀漀猀漀昀琀尀圀椀渀搀漀眀猀尀䌀甀爀爀攀渀琀嘀攀爀猀椀漀渀尀唀渀椀渀猀琀愀氀氀崀ഀ਀ਧ
@BurhanKhalid:我想你选择了big-endian(UTF-16BE)而不是little-endian。
>>print(z.decode('UTF-16LE'))✊✊嬀䠀䬀䔀夀开䰀伀䌀䄀䰀开䴀䄀䌀䠀䤀一䔀尀匀伀䘀吀圀䄀刀䔀尀䴀椀挀爀漀猀漀昀琀尀圀椀渀搀漀眀猀尀䌀甀爀爀攀渀琀嘀攀爀猀椀漀渀尀唀渀椀渀猀琀愀氀氀崀ഀ਀ਧ'@BurhanKhalid:您正在解码OP输出的第三行。因为OP没有考虑编码,Python在每个代码> \n>代码>字节之后结束了每行,在UTF 16LE字符的中间造成了一个中断。因此,第一行之后的行以实际属于前一行的NUL字节开始,并且对这些行应用UTF-16LE解码而不丢弃前导NUL会产生错误的结果。尝试解码除第一行最后一个字节以外的所有字节,或解码除第三行第一个和最后一个字节以外的所有字节。为了将来参考,您是如何确定编码的?@TechMedicNYC Google:-)