io.StringIO
와 io.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 모드 동작
StringIO
와BytesIO
는 일반 파일 핸들과 달리, 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이란
2023.12.05 - [Python] - [Python] File Handling
'Python' 카테고리의 다른 글
[PyTorch] torchvision.transform 사용법 (0) | 2025.01.12 |
---|---|
[Py] Serialization of Python: pickle (1) | 2024.11.27 |
[Py] Context Manager: with statement! (0) | 2024.11.27 |
[Py] Higher-order Function (고차함수) (1) | 2024.11.20 |
[Py] 숫자 야구 게임: structured programming, type annotation, and OOP (0) | 2024.11.20 |