python array.tostring()中有NUL个字节

时间:2011-12-04 17:32:25

标签: python arrays unicode python-3.x

我在unittest TestCase中有以下代码(作为示例)

def test(self):
    a = array('u','\0'*3)
    a[0] = 'h'
    a[1] = 'h'
    a[2] = 'h'

    self.assertEqual(a.tostring(), "hhh")

断言失败,出现以下错误:

AssertionError: b'h\x00\x00\x00h\x00\x00\x00h\x00\x00\x00' != 'hhh'

现在我明白我创建的数组是用于4个字节长的Unicode字符,因此我输入的每个字符都需要额外的3个NUL字节。我的问题是:

  1. 我可以将字符串“hhh”转换为内插我的断言的Unicode表示吗?
  2. 是否有ascii选项用?
  3. 创建我的数组

    编辑:回答已经出现的问题: 1.我使用的是Python 3 2.数组来自模块数组,可以导入:from array import array

2 个答案:

答案 0 :(得分:3)

我想你正在使用Python3,它似乎缺少'c'的{​​{1}}选项。

在这种情况下,我会做

array

另一种选择是

a = array.array("b",4*(0,))
a[0] = 'h'
a[1] = 'h'
a[2] = 'h'

但是你有一个unicode字符串而不是a=array.array('u', "hhh") # the same as yours, but shorter a.tounicode() 对象。

答案 1 :(得分:1)

您所做的是明确请求数组的bytes表示。当然,这不等于unicode表示。

来自文档:

  

array.tostring():tobytes()的弃用别名。

     

array.tobytes():将数组转换为机器值数组   并返回字节表示(相同的字节序列)   这将通过tofile()方法写入文件。)

     

3.2版中的新功能:为清晰起见,将tostring()重命名为tobytes()。

您需要使用tounicode代替:

>>> import array
>>> s = "a\xbb\ucccc\U0001dddd"
>>> array.array('u', s).tounicode() == s
True

如果要从Python 2.x中迁移某些代码,您会发现这与您在那里看到的相当;上述代码段的Python 2.x版本的唯一区别是s = u"etc etc"

类型'u'是阵列模块中一个黑暗的很少访问的角落,它本身就是Python的一个黑暗角落。如果你不是从Python 2.x迁移,你可能想说出你想要实现的目标(可变字符串?),并获得一些指导。