在Python 2.7中,我可以像这样创建一个字符数组:
#Python 2.7 - works as expected
from array import array
x = array('c', 'test')
但在Python 3 'c'
中不再是可用的类型代码。如果我想要一个字符数组,我该怎么办? 'u'
类型也将被移除。
#Python 3 - raises an error
from array import array
x = array('c', 'test')
TypeError:不能使用str来使用类型代码'c'初始化数组
答案 0 :(得分:5)
使用字节数组'b',与unicode字符串进行编码。
使用array.tobytes().decode()
和array.frombytes(str.encode())
转换为字符串和从字符串转换。
>>> x = array('b')
>>> x.frombytes('test'.encode())
>>> x
array('b', [116, 101, 115, 116])
>>> x.tobytes()
b'test'
>>> x.tobytes().decode()
'test'
答案 1 :(得分:2)
似乎python开发人员不再支持在数组中存储字符串,因为大多数用例都会使用新的bytes
interface或bytearray
。 @MarkPerryman's solution似乎是您最好的选择,尽管您可以通过子类使.encode()
和.decode()
透明:
from array import array
class StringArray(array):
def __new__(cls,code,start=''):
if code != "b":
raise TypeError("StringArray must use 'b' typecode")
if isinstance(start,str):
start = start.encode()
return array.__new__(cls,code, start)
def fromstring(self,s):
return self.frombytes(s.encode())
def tostring(self):
return self.tobytes().decode()
x = StringArray('b','test')
print(x.tostring())
x.fromstring("again")
print(x.tostring())
答案 2 :(得分:0)
感谢Mark Perryman:
>>> x = array('b')
>>> x.frombytes('test'.encode())
>>> x
array('b', [116, 101, 115, 116])
>>> x.tobytes()
b'test'
>>> x.tobytes().decode()
'test'
其他:
>> x.frombytes('hellow world'.encode())
>>> x
array('b', [116, 101, 115, 116, 104, 101, 108, 108, 111, 119, 32, 119, 111, 114, 108, 100])
>>> x.tostring()
b'testhellow world'
>>> x[1]
101
>>> x[1]^=0x1
>>> x[1]
100
>> x.tobytes().decode()
'wdsthellow world'
>>> x.tobytes
<built-in method tobytes of array.array object at 0x11330b7b0>
>>> x.tobytes()
b'wdsthellow world'
确实,我最近需要从阵列列表中转换一个特殊字节,
尝试了各种方法,然后获得了新的简单方法:x[1]^=0x1
,然后
可以通过array.array['b', <my bytes list>]