Python - 将二进制文件中的宽字符字符串转换为Python Unicode字符串

5

今天过得很漫长,我有点困惑。

我正在读取一个包含许多宽字符字符串的二进制文件,并希望将其转储为Python Unicode字符串。(为了解包非字符串数据,我使用struct模块,但我不知道如何处理字符串。)

例如,读取单词"Series":

myfile = open("test.lei", "rb")
myfile.seek(44)
data = myfile.read(12)

# data is now 'S\x00e\x00r\x00i\x00e\x00s\x00'

我该如何将原始的宽字符数据编码为Python字符串?
编辑:我正在使用Python 2.6

“file” 不应该用于打开文件;应该使用 “open”。如果这确实是一个编码有些奇怪的文本文件,那么 “codecs.open” 是一个很好的选择。 - Mike Graham
Mike G - 很正确,我已经更正了这个例子。实际上,我通常使用“open”,但今天我的ipython shell出了一些问题,给了我一个晦涩的错误。我可能已经用其他东西覆盖了它。 - Mikesname
4个回答

8
>>> data = 'S\x00e\x00r\x00i\x00e\x00s\x00'
>>> data.decode('utf-16')
u'Series'

3

我也建议在解码后使用rstrip'\x00'一起,以删除所有'\x00'尾随字符,除非它们当然不需要。

>>> data = 'S\x00o\x00m\x00e\x00\x20\x00D\x00a\x00t\x00a\x00\x00\x00\x00\x00'
>>> print '"%s"' % data.decode('utf-16').rstrip('\x00')
>>> "Some Data"

如果没有使用 rstrip('\x00'),结果会带有尾随空格:

>>> "Some Data  "

2
如果所涉及的字符串已知不包含FF以外的任何字符,则可以通过省略零字节生成字符串而不是Unicode对象,这是另一种可能性:
>>> 'S\x00e\x00r\x00i\x00e\x00s\x00'[::2]
'Series'

0

嗯,你为什么说“open”比“file”更好呢?我在参考文献(Python 2.5)中看到:

3.9 文件对象 文件对象使用C的stdio包实现,并且可以使用内置构造函数file()创建,该函数在第2.1节“内置函数”中描述。3.6 ----- 脚注(3.6)file()是Python 2.2中的新功能。旧的内置函数open()是file()的别名。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接