2015년 4월 1일 수요일

파이선 bytearray 오브젝트 (bytearray object in Python)

파이선의 bytearray는 바이트 값을 저장하는 버퍼 오브젝트이다. 파이선으로 디바이스를 다루는 코드를 다루다 보면 bytearray를 자주 접하게 되기 때문에 이에 대해 간단하게 정리해 놓았다. bytearray는 원래 파이선3에서 처음 도입되었는데 파이선2.7에 백워드 포팅 되었다.

- 리스트에서 bytearray 만들기

>>> elements = [0, 200, 50, 25, 10, 255]
>>> values = bytearray(elements)
>>> values
bytearray(b'\x00\xc82\x19\n\xff')

- bytearray의 element를 변경

>>> values[0] = 5
>>> values[1] = 0

bytearray는 mutable 오브젝트이므로 element의 값을 변경할 수 있다.

- bytearray의 내용 출력

>>> for v in values:
...   print v
...
5
0
50
25
10
255


>>>

일반 리스트와 동일하게 iterate 할 수 있다.

- 문자열로 bytearray 만들기

>>> data = bytearray(b"abc")
>>> data
bytearray(b'abc')
>>> for d in data:
...   print d
...
97
98
99
>>>

문자열로 bytearray를 만들때는 문자열 앞에 ‘b’를 붙여줘야 한다. 

- bytearray slice

>>> values = [5,10,15,20]
>>> arr = bytearray(values)
>>> arr
bytearray(b'\x05\n\x0f\x14')
>>> arr[0:2]
bytearray(b'\x05\n')
>>> arr[0:2] = [100, 0, 0]
>>> arr
bytearray(b'd\x00\x00\x0f\x14')
>>> for v in arr:
...   print v
...
100
0
0
15
20
>>>

리스트와 동일하게 bytearray를 slice 할 수 있고, mutable이기 때문에 slice의 내용을 변경할 수도 있다. 

- Occurence Count

>>> arr = bytearray(b"aabbcccc")
>>> arr.count(b"c")
4
>>>

bytearray내의 각 element를 돌며 특정 패턴이 매치하는 횟수를 셀 수도 있다. count()의 argument는 byte 오브젝트여야만 한다. 즉 ‘b’로 시작하는 문자열 스트링이거나 0~255 사이의 정수값이어야 한다.

- Find pattern

>>> data = bytearray(b"python")
>>> data.find(b"on")
4
>>> data.find(b"java")
-1
>>>

bytearray 내에서 특정 문자열을 검색할 수도 있다. 이 경우 일치되는 문자열의 가장 왼쪽 인덱스를 리턴한다. 일치되는 문자열이 없으면 -1을 리턴한다.

- In operator

>>> data = bytearray([100,20,10,200,200])
>>> data
bytearray(b'd\x14\n\xc8\xc8')
>>> 200 in data
True
>>> 0 in data
False
>>>

in operator는 bytearray 내에 특정 element가 존재하는가를 확인한다.

- Merge

>>> left = bytearray(b"Hello ")
>>> right = bytearray(b"World")
>>> left+right
bytearray(b'Hello World')
>>>

list같이 “+”를 사용해 두개의 bytearray를 하나로 합칠 수 있다. 

- bytearray를 list로 변환

>>> init = [100,255,255,0]
>>> init
[100, 255, 255, 0]
>>> b = bytearray(init)
>>> b
bytearray(b'd\xff\xff\x00')
>>> result = list(b)
>>> result
[100, 255, 255, 0]
>>>

byte값들의 리스트 (0~255 사이의 숫자)는 bytearray로 변환할 수 있다. 반대로 bytearray를 list로 변환도 가능함

- Append, del, insert 

>>> vals = bytearray()
>>> vals.append(0)
>>> vals.append(1)
>>> vals.append(2)
>>> vals
bytearray(b'\x00\x01\x02')
>>> del vals[0:1]
>>> vals
bytearray(b'\x01\x02')
>>> vals.insert(1,3)
>>> vals
bytearray(b'\x01\x03\x02')
>>>

List와 동일하게 append, del, insert를 사용할 수 있다.


- ValueError 

>>> values = bytearray([1000,2000,3000])
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ValueError: byte must be in range(0, 256)
>>>

bytearray에 삽입되는 값은 0~255 범위여야만 한다. 범위 외의 값을 넣으려고 하면 ValueError가 발생

- 치환

>>> val = b"aaabbb"
>>> val.replace(b"bbb",b"ccc")
'aaaccc'
>>>

Buffer protocol은 String과 같은 메소드를 지원한다. String에서처럼 replace()를 사용할 수 있다. 단 argument는 bytes 오브젝트, 즉 “b” 문자열을 사용해야만 함

- Compare 

>>> val1 = b"desktop"
>>> val1
'desktop'
>>> val2 = bytearray(b"desktop")
>>> val2
bytearray(b'desktop')
>>> val1 == val2
True
>>>

'b' 문자열은 bytes 오브젝트이다. bytes 오브젝트를 비교하려면 ‘==‘를 사용함

- Start, end 

>>> val = b"users"
>>> val.startswith(b"user")
True
>>> val.endswith(b"s")
True
>>>

bytes 오브젝트를 string과 같이 다룰 수 있음. startswith와 endswith 역시 사용 가능. 단 argument는 bytes 오브젝트여야만 함

- Split, join 

>>> data = b"cat,dog,fish,bird"
>>> data
'cat,dog,fish,bird'
>>> elem = data.split(b",")
>>> elem
['cat', 'dog', 'fish', 'bird']
>>> len(elem)
4
>>> res = b",".join(elem)
>>> res
'cat,dog,fish,bird'
>>>


댓글 4개:

  1. 좋은정보 감사합니당 덕분에 파이썬 바이트어레이 더욱 이해할수 있게 되었어요 ~

    답글삭제
  2. 필요한것만 딱딱 정리 잘되어있네요! 도움이 많이 됬습니다. 감사드려요!

    답글삭제