详解Python中的array数组模块相关使用
初始化
array实例化可以提供一个参数来描述允许那种数据类型,还可以有一个初始的数据序列存储在数组中。
importarray
importbinascii
s='Thisisthearray.'
a=array.array('c',s)
print'Asstring:',s
print'Asarray:',a
print'Ashex:',binascii.hexlify(a)
数组配置为包含一个字节序列,用一个简单的字符串初始化。
>>>================================RESTART================================
>>>
Asstring:Thisisthearray.
Asarray:array('c','Thisisthearray.')
Ashex:54686973206973207468652061727261792e
处理数组
类似于其他python序列,可以采用同样方式扩展和处理array。
importarray
importpprint
a=array.array('i',xrange(3))
print'Initial:',a
a.extend(xrange(3))
print'Extended:',a
print'slice::',a[2:5]
print'Itetator:'
printlist(enumerate(a))
支持的操作包括分片,迭代以及向末尾增加元素。
>>>================================RESTART================================
>>>
Initial:array('i',[0,1,2])
Extended:array('i',[0,1,2,0,1,2])
slice::array('i',[2,0,1])
Itetator:
[(0,0),(1,1),(2,2),(3,0),(4,1),(5,2)]
数组和文件
可以使用高效读/写文件的专用内置方法将数组的内容写入文件或从文件读取数组。
importarray
importbinascii
importtempfile
a=array.array('i',xrange(5))
print'A1:',a
output=tempfile.NamedTemporaryFile()
a.tofile(output.file)
output.flush
withopen(output.name,'rb')asinput:
raw_input=input.read()
print'RawContents:',binascii.hexlify(raw_data)
input.seek(0)
a2=array.array('i')
a2.fromfile(input,len(a))
print'A2:',a2
候选字节顺序
如果数组中的数据没有采用固有的字节顺序,或者在发送到一个采用不同字节顺序的系统前需要交换顺序,可以在python转换整个数组而无须迭代处理每个元素。
importarray
importbinascii
defto_hex(a):
chars_per_item=a.itemsize*2
hex_version=binascii.hexlify(a)
num_chunks=len(hex_version)/chars_per_item
foriinxrange(num_chunks):
start=i*chars_per_item
end=start+chars_per_item
yieldhex_version[start:end]
a1=array.array('i',xrange(5))
a2=array.array('i',xrange(5))
a2.byteswap()
fmt='%10s%10s%10s%10s'
printfmt%('A1_hex','A1','A2_hex','A2')
printfmt%(('-'*10,)*4)
forvalueinzip(to_hex(a1),a1,to_hex(a2),a2):
printfmt%value
byteswap()会交换C数组中元素的字节顺序,比在python中循环处理数据高效的多。
>>>================================RESTART================================ >>> A1_hexA1A2_hexA2 ---------------------------------------- 000000000000000000 0100000010000000116777216 0200000020000000233554432 0300000030000000350331648 0400000040000000467108864