Python에서 특정 파일을 open하는 경우,
text mode 또는 binary mode 중 하나로 열게 된다.
이 둘의 차이점은 간단히 설명하면,
현재
open
하고자 하는 file을 text파일로 처리할지
아니면 binary파일로 처리할지를 결정하는 것임.
binary mode 로 file을 여는 경우,
- Python은 해당 file을 순수한 bytes의 형태로 취급함.
- 해당 파일을 byte 단위로 읽어들이면서
- 어떠한 변환없이 file에 기재된 bytes 의 값들을 그대로 읽어들임.
text mode로 file을 여는 경우,
- 사람이 읽을 수 있는 문자들로 구성된 text file이라고 생각하며,
- file의 bytes 값들을 사람이 읽을 수 있는 문자로 표시 하기 위한 encoding 방식에 따라 bytes를 처리함.
- 때문에 text mode로 file 을 open하는 경우, 사용할 encoding 방식이 지정되게 됨 (생략된 경우엔 기본 encoding이 사용됨)
참고
text mode로 file을 여는 데, encoding 방식에서 지정되지 않은 값을 가지는 bytes가 있을 경우
- UnicodeDecodeError 가 발생하여 file을 열 수 없다.
- 단,
errors='ignore'
로 지정하여 open을 할 경우엔 해당 bytes들을 무시한다.
Example
이 예제 코드는 binary mode 와 text mode 의 차이를 보여준다.
아래의 예에서 ascii 인코딩에서 지원하는 a
, b
사이에 2 bytes의 0x80
, 0x81
를 파일에 기재함.
null 문자
와 다른 점을 비교하기 위해- 인코딩을 지원하지 않는
0x80
과0x81
사이에 - ascii 인코딩에서
null 문자
에 해당하는0x00
을 2개 기재함.
np_c = bytes([128])
np_c_str = np_c.decode('ascii',errors='ignore')
np_c1 = bytes([129])
np_c1_str = np_c.decode('ascii',errors='ignore')
null_c = bytes([0])
null_str = null_c.decode('ascii', errors='ignore')
with open('bin2txt.txt', 'wb') as f:
f.write('a'.encode('ascii'))
f.write(np_c)
f.write(null_c)
f.write(null_c)
f.write(np_c1)
f.write('b'.encode('ascii'))
해당 파일은 txt 확장자임에도 ascii 인코딩에서 지원하지 않는 2 bytes의 데이터를 가지고 있는 꼴임.
- 전체 사이즈는 6바이트 임.
이를 python에서 text파일모드로 읽어들일 경우, 해당 bytes에 대한 출력이 이루어지지 않음을 확인할 수 있으며, binary mode 로 읽을 경우 각 바이트의 값을 제대로 읽어들임을 알 수 있음.
with open('bin2txt.txt', 'rt', encoding='ascii', errors='ignore') as f:
while True:
a = f.read(1)
if not a :
break
print(f'[{a}]')
# output은 다음과 같음.
# [a]
# []
# []
# [b]
#---------------------------------
with open('bin2txt.txt', 'rb', ) as f:
while True:
a = f.read(1)
if not a :
break
print(f'[{a}]')
# output은 다음과 같음.
# [b'a']
# [b'\x80']
# [b'\x00']
# [b'\x00']
# [b'\x81']
# [b'b']
Python에서
text mode로 읽어들일 경우, 읽어들인 데이터의 type이 str
이고,
binary mode 로 읽어들일 경우 bytes
임.
참고자료
좀더 자세한 text 파일과 binary 파일의 차이점(text 파일 위주)은 다음 글을 참고할 것.
2024.01.07 - [분류 전체보기] - [CE] Text file : Text 파일이란?
2023.12.05 - [Python] - [Python] File Handling
728x90
'Python' 카테고리의 다른 글
[Python] `struct` 사용하기: bytes 로 C언어 구조체 다루기. (1) | 2024.01.15 |
---|---|
[Python] bytes and bytearray: Binary Data for Python (0) | 2024.01.15 |
[pandas] 데이터 타입에 따른 column 추출 (0) | 2024.01.12 |
[pandas] merge 예제. (0) | 2024.01.12 |
[pandas] DataFrame 합치기 : concat 과 merge (0) | 2024.01.12 |