본문 바로가기
Python

[python] Text mode vs. Binary mode: File open

by ds31x 2024. 1. 15.

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 문자와 다른 점을 비교하기 위해
  • 인코딩을 지원하지 않는 0x800x81 사이에
  • 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 파일이란?

 

[CE] Text file : Text 파일이란?

"text file" 은 사람과 컴퓨터가 읽을 수 있고 처리할 수 있도록 encoding 된 characters 로 이루어진 electric text lines 로 구성되는 형태의 파일 포맷 및 해당 파일을 가르킴. 특징. text file 이 가지는 다양한

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 close Python 에서 file을 처리하기 위해선 다른 프로그래밍 언어와 마찬가지로 file에 대한 접근이 가능한 object를 얻어와

ds31x.tistory.com


관련 gist

https://gist.github.com/dsaint31x/0b7e0706eb44c73cedc54e0ee8bac175

 

python_txt_vs_binary.ipynb

python_txt_vs_binary.ipynb. GitHub Gist: instantly share code, notes, and snippets.

gist.github.com