Python에서 특정 파일을 open하는 경우,
text mode 또는 binary mode 중 하나로 열게 된다.
이 둘의 차이점은 간단히 설명하면,
현재
open
하고자 하는 file을 text파일로 처리할지
아니면 binary파일로 처리할지를 결정하는 것임.
1. binary mode 로 file을 여는 경우,
- Python은 해당 file을 순수한 bytes의 형태로 취급함.
- 해당 파일을 byte 단위로 읽어들이면서
- 어떠한 변환없이 file에 기재된 bytes 의 값들을 그대로 읽어들임.
2. text mode로 file을 여는 경우,
- 사람이 읽을 수 있는 문자들로 구성된 text file이라고 생각하며,
- file의 bytes 값들을 사람이 읽을 수 있는 문자로 표시 하기 위한 encoding 방식에 따라 bytes를 처리함.
- 때문에 text mode로 file 을 open하는 경우, 사용할 encoding 방식이 지정되게 됨
(생략된 경우엔 기본 encoding이 사용됨)
# default encoding 확인하기.
import sys
print(sys.getdefaultencoding()) # 출력: utf-8
3. 참고
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
을 1개 기재함.
np_c0 = bytes([128]) # ascii에 없는 문자0
np_c0_str = np_c0.decode('ascii',errors='ignore')
print(f"{type(np_c0) = }, {type(np_c0_str) = }")
print(f"{np_c0 = }, {np_c0_str = }")
print("-------------")
np_c1 = bytes([129]) # ascii에 없는 문자1
np_c1_str = np_c1.decode('ascii',errors='ignore')
print(f"{type(np_c1) = }, {type(np_c1_str) = }")
print(f"{np_c1 = }, {np_c1_str = }")
null_c = bytes([0]) # null 문자.
null_str = null_c.decode('ascii', errors='ignore')
with open('bin2txt.txt', 'wb') as f:
f.write('a'.encode('ascii'))
f.write(np_c0)
f.write(null_c)
f.write(np_c1)
f.write('b'.encode('ascii'))
해당 파일은 txt 확장자 임에도 ascii 인코딩에서 지원하지 않는 2 bytes의 데이터를 가지고 있는 꼴임.
- 전체 파일 사이즈는 5 바이트 임.
이를 python에서 text mode 로 읽어들일 경우,
- 해당 bytes에 대한 "읽기 자체가 이루어지지 않음(
ignore
로 처리해서임)" 을 읽은 글자 수 (아래 예제 코드에서 cnt)로 확인할 수 있으며, - binary mode 로 읽을 경우 각 바이트의 값을 그대로 읽어들임 을 알 수 있음.
with open('bin2txt.txt', 'rt', encoding='ascii', errors='ignore') as f:
cnt = 0
while True:
character = f.read(1)
if not character :
break
cnt += 1
print(f'[{character}]')
print(f"읽은 문자: {cnt} 개")
# output은 다음과 같음: 아래의 []는 null문자임.
# [a]
# []
# [b]
# 읽은 문자: 3 개
#---------------------------------
with open('bin2txt.txt', 'rb', ) as f:
cnt = 0
while True:
read_byte = f.read(1) #1byte 읽기
if not read_byte :
break
cnt += 1
print(f'[{read_byte}]')
print(f"읽은 바이트: {cnt} bytes")
# output은 다음과 같음.
# [b'a']
# [b'\x80']
# [b'\x00']
# [b'\x81']
# [b'b']
# 읽은 바이트: 5 bytes
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
관련 gist
https://gist.github.com/dsaint31x/0b7e0706eb44c73cedc54e0ee8bac175
'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 |