본문 바로가기
Python

[Py] io.StringIO 와 io.BytesIO

by ds31x 2024. 12. 3.

io.StringIOio.BytesIO

  • Python의 io 모듈에서 제공하는 메모리 기반 파일 객체(memory-based file object)임.
  • 이들은 데이터를 메모리에 저장하면서 파일처럼 다룰 수 있는 기능을 제공함: Stream Object
  • 두 클래스는 파일 시스템을 사용하지 않고 데이터를 처리한다는 점에서 효율적이며,
  • 각각 텍스트 데이터(text data)바이너리 데이터(binary data) 처리에 특화되어 있음.

open과 close가 필요한 file 객체와
거의 유사한 사용법(API)을 가지면서
memory 기반으로 동작하는 stream  제공

 

stream 객체란
데이터를 연속적으로 읽거나 쓰는 방식으로 처리하는데 사용되는 추상화된 객체.
주로 데이터를 한번에 로드하지 않고 처리하는 방식으로, file 및 network에서 데이터를 읽고 쓰는데 많이 이용됨.

1. io.StringIO

특징

  • 텍스트 데이터(str)를 처리하기 위해 설계된 스트림 객체(stream object)임.
  • 데이터를 메모리에서 파일처럼 다룰 수 있도록 제공함.
  • 내부적으로 인코딩/디코딩(encoding/decoding)이 자동으로 처리되며, 문자열 데이터를 효율적으로 다룰 수 있음.
from io import StringIO

# 줄 바꿈 문자 포함된 데이터
text = StringIO("Hello\nWorld")
print(text.read())  # "Hello\nWorld" 반환

2. io.BytesIO

특징

  • 바이너리 데이터(bytes)를 처리하기 위해 설계된 스트림 객체임.
  • 데이터를 메모리에서 파일처럼 다룰 수 있도록 제공함.
  • 인코딩/디코딩을 명시적으로 수행해야 하며, 이미지, 파일 등 바이너리 데이터를 다룰 때 유용함.
from io import BytesIO

# 줄 바꿈 문자 포함된 데이터
binary = BytesIO(b"Hello\nWorld")
print(binary.read())  # b"Hello\nWorld" 반환

 


3. 주요 차이점

항목 StringIO BytesIO
데이터 타입 문자열(str) 바이너리 데이터(bytes)
줄 바꿈(newline) 처리 플랫폼에 관계없이 \n으로 고정 줄 바꿈 문자를 명시적으로 처리해야 함
단위 글자 단위(character unit) 바이트 단위(byte unit)
seek()의 오프셋 단위 글자 단위 바이트 단위
반환값 문자열(str) 반환 바이너리 데이터(bytes) 반환
주요 용도 텍스트 데이터 처리 바이너리 데이터 처리

4. 주요 메서드 설명

4.1. read([size]): 데이터를 읽는 메서드

  • 파일 포인터(file pointer)의 현재 위치에서 데이터를 읽음.
  • size를 지정하면 해당 크기만큼 데이터를 읽고, 생략하면 파일 끝까지 읽음.
  • EOF(End of File)에 도달하면 빈 문자열("") 또는 빈 바이트(b"")를 반환함.
  • 데이터를 읽은 후 파일 포인터가 이동함.

4.2. readline(): 한 줄씩 읽는 메서드

  • 파일 포인터의 현재 위치부터 데이터를 한 줄 읽음.
  • 줄 바꿈 문자(newline, \n) 를 기준으로 데이터를 읽고, 파일 포인터가 다음 줄로 이동함.
  • EOF에 도달하면 빈 문자열("") 또는 빈 바이트(b"")를 반환함.
# StringIO
text = StringIO("Hello\nWorld")
print(text.readline())  # "Hello\n" 반환
print(text.readline())  # "World" 반환

# BytesIO
binary = BytesIO(b"Hello\nWorld")
print(binary.readline())  # b"Hello\n" 반환
print(binary.readline())  # b"World" 반환

4.3. seek(offset, whence=0): 스트림 위치를 이동하는 메서드

  • StringIO: offset글자 단위로 계산됨.
  • BytesIO: offset바이트 단위로 계산됨.
  • whence 값:
    • 0: 스트림의 시작 (기본값).
    • 1: 현재 위치.
    • 2: 스트림의 끝.
whence: 기준점. whence는 from where 의 뜻을 가짐.

4-4. getvalue(): 스트림의 전체 내용을 반환하는 메서드

  • 파일 포인터의 위치와 관계없이 스트림의 모든 데이터를 반환하는 메서드.
  • 파일 포인터 위치에 영향을 주지 않음.

5. EOF (End of File) 처리

EOF 동작 설명

  • read()readline(): 파일 포인터가 EOF에 도달하면 빈 문자열("") 또는 빈 바이트(b"")를 반환함.
  • 추가 데이터 쓰기: EOF 상태에서도 데이터를 추가로 쓸 수 있음.

6. Append 모드(?)

Append 모드 동작

  • StringIOBytesIO는 일반 파일 핸들과 달리, append 모드를 지원하지 않음.
  • EOF로 이동한 후 데이터를 추가하여 유사한 동작을 구현할 수 있음.
## StringIO
text = StringIO("Hello")
text.seek(0, 2)  # EOF로 이동
text.write(" World")
print(text.getvalue())  # "Hello World"

## BytesIO
binary = BytesIO(b"Hello")
binary.seek(0, 2)  # EOF로 이동
binary.write(b" World")
print(binary.getvalue())  # b"Hello World"

같이 보면 좋은 자료

2024.09.11 - [CE] - [CE] Stream이란

 

[CE] Stream이란

Stream:데이터를 연속적으로 흐르는 방식으로 처리한다는 개념으로,데이터의 입출력을 일종의 bit (or byte) 들의 흐름으로 여겨서 처리하는 것으로 생각하고이와 같은 방식으로 I/O가 이루어지는 대

ds31x.tistory.com

2023.12.05 - [Python] - [Python] File Handling

 

[Python] File Handling

File 열고 닫기.2023.07.04 - [Python] - [Python] file : open and close [Python] file : open and closePython 에서 file을 처리하기 위해선 다른 프로그래밍 언어와 마찬가지로 file에 대한 접근이 가능한 object를 얻어와야

ds31x.tistory.com