详解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