ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Python] io.BytesIO truncate 알아보기
    Python 2024. 2. 22. 07:05
    728x90
    반응형

     

    - 목차

     

    들어가며.

    이번 글에서는 파이썬의 io 모듈의 BytesIO 에 대해서 알아봅니다.

    특히, BytesIO 로 생성된 ByteBuffer 의 truncate 기능에 대해서 자세히 알아보려고 합니다.

     

    파이썬의 io 모듈은 StringIO 와 BytesIO 객체를 제공합니다.

    이들은 메모리 상에 저장된 문자 정보를 마치 파일을 다루는 듯한 API 를 제공합니다.

    그래서 read, seek, truncate 등의 File Read, Write API 를 사용할 수 있습니다.

     

    하지만 이들이 저장하고 관리하는 실질적인 데이터를 동일합니다.

    아래의 예시처럼 이들은 "모든 소문자 알파벳들"을 저장할 뿐이며, 제공되는 API 가 다르죠.

    data: str = "abcdefghijklmnopqrstuvwxyz"
    print(f"str : {data}")
    
    import io
    buf: io.StringIO = io.StringIO("abcdefghijklmnopqrstuvwxyz")
    print(f"buf : {buf.read(100)}")

     

    < 출력 >

    str : abcdefghijklmnopqrstuvwxyz
    buf : abcdefghijklmnopqrstuvwxyz

     

     

    truncate.

    BytesIO 는 아래와 같은 방식으로 생성됩니다.

    특히, tell 함수를 통해서 탐색 중인 Position 을 확인할 수 있구요.

    getbuffer().nbytes 를 통해서 전체 Bytes 사이즈를 알 수 있죠.

    import io
    buf = io.BytesIO(b"abcdefghijklmnopqrstuvwxyz")
    
    print(f" current position : {buf.tell()} ")
    print(f" size : {buf.getbuffer().nbytes} ")
     current position : 0 
     size : 26

     

     

    이 상황에서 truncate 를 실행하게되면 BytesIO 의 사이즈를 0 이 됩니다.

    buf.truncate(0)
    print(f" current position : {buf.tell()} ")
    print(f" size : {buf.getbuffer().nbytes} ")
     current position : 0 
     size : 0

     

     

    read 이후에 truncate.

    이번에는 BytesIO 를 몇차례 read 한 이후에 truncate 를 수행합니다.

    read 함수로 BytesIO 의 Byte 를 읽어들이게 되면, Position 이 변하게 됩니다.

    import io
    buf = io.BytesIO(b"abcdefghijklmnopqrstuvwxyz")
    
    print(buf.read(1))
    print(f" current position : {buf.tell()} ")
    
    print(buf.read(1))
    print(f" current position : {buf.tell()} ")
    
    print(buf.read(1))
    print(f" current position : {buf.tell()} ")
    b'a'
     current position : 1 
    b'b'
     current position : 2 
    b'c'
     current position : 3

     

    그 이후에 truncate 를 수행하게 되면 BytesIO 의 사이즈를 0 으로 리셋되지만,

    Position 은 여전히 3 으로 머물게 됩니다.

    buf.truncate(0)
    print(f" current position : {buf.tell()} ")
    print(f" size : {buf.getbuffer().nbytes} ")
     current position : 3 
     size : 0

     

    그래서 truncate 이후에는 "buf.seek(0)" 를 통해서 current position 을 초기화시켜주는 작업이 마무리되어야 합니다.

    buf.seek(0)

     

    반응형
Designed by Tistory.