Created at : 2024-09-02 10:41
Auther: Soo.Y
2. 기본 문법 (확장)
2.7 문자열과 인코딩 (ASCII, UTF-8, CP949)
파이썬에서 문자열은 문자들의 시퀀스로, 이러한 문자는 내부적으로 특정 인코딩 방식으로 저장됩니다. 인코딩은 문자를 컴퓨터가 이해할 수 있는 이진수로 변환하는 방법입니다. 파이썬은 다양한 인코딩을 지원하며, 그 중에서도 ASCII, UTF-8, CP949와 같은 인코딩이 자주 사용됩니다. 이 섹션에서는 각 인코딩 방식의 특징과 파이썬에서의 사용 방법을 알아보겠습니다.
2.7.1 ASCII (American Standard Code for Information Interchange)
- ASCII는 초기의 문자 인코딩 방식으로, 영어 알파벳과 일부 제어 문자들을 7비트로 표현합니다. 총 128개의 문자만을 표현할 수 있으며, 주로 영어와 같은 단순한 언어의 텍스트 표현에 사용됩니다.
- 파이썬에서 ASCII 인코딩:
text = "Hello"
ascii_encoded = text.encode('ascii') # 문자열을 ASCII로 인코딩
print(ascii_encoded) # 출력: b'Hello'
- ASCII 디코딩:
ascii_decoded = ascii_encoded.decode('ascii') # ASCII 인코딩된 바이트를 다시 문자열로 디코딩
print(ascii_decoded) # 출력: Hello
2.7.2 UTF-8 (8-bit Unicode Transformation Format)
- UTF-8은 전 세계의 모든 문자를 표현할 수 있는 유니코드(Unicode) 표준의 인코딩 방식 중 하나입니다. UTF-8은 가변 길이 인코딩 방식으로, 각 문자는 1바이트에서 4바이트까지 다양한 크기로 인코딩됩니다.
- UTF-8은 ASCII와 호환되며, 다국어 지원이 필요할 때 널리 사용됩니다. 특히 웹과 같은 환경에서 기본 인코딩 방식으로 사용됩니다.
- 파이썬에서 UTF-8 인코딩:
text = "안녕하세요"
utf8_encoded = text.encode('utf-8') # 문자열을 UTF-8로 인코딩
print(utf8_encoded) # 출력: b'\xec\x95\x88\xeb\x85\x95\xed\x95\x98\xec\x84\xb8\xec\x9a\x94'
- UTF-8 디코딩:
utf8_decoded = utf8_encoded.decode('utf-8') # UTF-8 인코딩된 바이트를 다시 문자열로 디코딩
print(utf8_decoded) # 출력: 안녕하세요
2.7.3 CP949 (Code Page 949)
- CP949는 윈도우 운영 체제에서 한글을 표현하기 위해 사용되는 문자 인코딩 방식입니다. 이는 EUC-KR의 확장형으로, 한국어와 관련된 문자들을 표현하는 데 사용됩니다. 하지만 CP949는 한국어와 관련된 문자만 지원하므로, 국제적으로는 UTF-8을 사용하는 것이 권장됩니다.
- 파이썬에서 CP949 인코딩:
text = "안녕하세요"
cp949_encoded = text.encode('cp949') # 문자열을 CP949로 인코딩
print(cp949_encoded) # 출력: b'\xbe\xc8\xb3\xe7\xc7\xcf\xbc\xbc\xbf\xe4'
- CP949 디코딩:
cp949_decoded = cp949_encoded.decode('cp949') # CP949 인코딩된 바이트를 다시 문자열로 디코딩
print(cp949_decoded) # 출력: 안녕하세요
2.7.4 인코딩 변환
파이썬에서는 한 인코딩 방식에서 다른 인코딩 방식으로 변환하는 것도 가능합니다. 예를 들어, CP949로 인코딩된 텍스트를 UTF-8로 변환할 수 있습니다.
- 인코딩 변환 예시:
# CP949로 인코딩된 문자열을 UTF-8로 변환하기
text_cp949 = "안녕하세요".encode('cp949') # CP949로 인코딩
text_utf8 = text_cp949.decode('cp949').encode('utf-8') # 먼저 CP949를 디코딩 후, UTF-8로 다시 인코딩
print(text_utf8) # 출력: b'\xec\x95\x88\xeb\x85\x95\xed\x95\x98\xec\x84\xb8\xec\x9a\x94'
2.7.5 인코딩 처리에서의 주의사항
- 디코딩 오류: 텍스트를 잘못된 인코딩으로 디코딩하려 하면 오류가 발생할 수 있습니다. 이 경우
errors
파라미터를 사용해 오류를 무시하거나 대체 문자를 지정할 수 있습니다.
try:
print(b'\xbe\xc8\xb3\xe7\xc7\xcf\xbc\xbc\xbf\xe4'.decode('utf-8')) # 잘못된 인코딩으로 디코딩 시도
except UnicodeDecodeError as e:
print("디코딩 오류:", e)
- 인코딩 설정: 텍스트 파일을 읽거나 쓸 때, 파일의 인코딩 방식을 명시하는 것이 좋습니다.
# 파일을 UTF-8로 읽기
with open('example.txt', 'r', encoding='utf-8') as file:
content = file.read()
# 파일을 CP949로 쓰기
with open('example_cp949.txt', 'w', encoding='cp949') as file:
file.write(content)
이러한 인코딩 방식들을 이해하고 적절하게 사용하는 것은 다양한 언어를 처리할 수 있는 유연한 프로그램을 작성하는 데 매우 중요합니다. 각 인코딩 방식의 특징을 이해하고, 필요에 따라 적절한 인코딩을 선택하는 것이 좋습니다.
2.8 문자열 포매팅 (Print Formatting)
파이썬에서 문자열 포매팅은 변수를 포함한 문자열을 구성하는 방법을 제공합니다. 문자열 포매팅을 통해 더 유연하고 읽기 쉬운 출력을 만들 수 있습니다. 파이썬에서는 문자열을 포매팅하는 여러 가지 방법을 제공합니다. 이 섹션에서는 대표적인 세 가지 방법을 소개하겠습니다: printf
스타일 포매팅, str.format()
메서드, 그리고 f-string을 사용한 포매팅입니다.
2.8.1 printf
스타일 포매팅
C 언어의 printf
스타일 포매팅을 기반으로 하는 방식으로, %
연산자를 사용해 문자열에 변수를 삽입합니다.
- 기본 사용법:
name = "Alice"
age = 30
print("이름: %s, 나이: %d" % (name, age))
# 출력: 이름: Alice, 나이: 30
- 포맷 코드:
%s
: 문자열(String)%d
: 정수(Integer)%f
: 실수(Float)%x
: 16진수(Hexadecimal)
height = 175.5
print("키: %.2f cm" % height)
# 출력: 키: 175.50 cm
위 예제에서 %.2f
는 소수점 이하 두 자리까지 표시하라는 의미입니다.
2.8.2 str.format()
메서드
str.format()
메서드는 기존 %
스타일 포매팅의 단점을 보완하여, 더 강력하고 유연한 포매팅 방법을 제공합니다.
- 기본 사용법:
name = "Bob"
age = 25
print("이름: {}, 나이: {}".format(name, age))
# 출력: 이름: Bob, 나이: 25
- 인덱스와 키워드 인자 사용:
print("이름: {0}, 나이: {1}".format(name, age))
# 출력: 이름: Bob, 나이: 25
print("이름: {name}, 나이: {age}".format(name="Charlie", age=28))
# 출력: 이름: Charlie, 나이: 28
- 포맷 지정자 사용:
height = 180.456
print("키: {:.1f} cm".format(height))
# 출력: 키: 180.5 cm
여기서 :.1f
는 소수점 이하 한 자리까지 표시하라는 의미입니다.
2.8.3 f-string 포매팅 (파이썬 3.6+)
f-string은 파이썬 3.6에서 도입된 가장 간편하고 강력한 문자열 포매팅 방법입니다. 문자열 앞에 f
를 붙이고, 중괄호 {}
안에 변수를 넣어 사용합니다.
- 기본 사용법:
name = "David"
age = 22
print(f"이름: {name}, 나이: {age}")
# 출력: 이름: David, 나이: 22
- 표현식 사용: f-string 내에서 표현식을 직접 사용할 수 있습니다.
print(f"{name}은 내년에 {age + 1}살이 됩니다.")
# 출력: David은 내년에 23살이 됩니다.
- 포맷 지정자 사용:
pi = 3.14159
print(f"원주율: {pi:.2f}")
# 출력: 원주율: 3.14
2.8.4 정렬과 너비 지정
포맷팅을 사용할 때, 출력의 정렬과 너비를 지정할 수도 있습니다.
- 왼쪽 정렬, 오른쪽 정렬, 가운데 정렬:
print(f"|{'왼쪽 정렬':<10}|{'오른쪽 정렬':>10}|{'가운데 정렬':^10}|")
# 출력: |왼쪽 정렬 | 오른쪽 정렬| 가운데 정렬 |
-
<
: 왼쪽 정렬 -
>
: 오른쪽 정렬 -
^
: 가운데 정렬 -
고정 너비 지정:
number = 123
print(f"숫자: {number:5d}")
# 출력: 숫자: 123
여기서 5d
는 최소 5칸의 너비를 차지하도록 정수를 출력하라는 의미입니다.
2.8.5 천 단위 구분기호 추가
큰 숫자를 포매팅할 때, 천 단위 구분기호를 넣을 수 있습니다.
- 천 단위 구분기호 사용:
large_number = 1000000
print(f"숫자: {large_number:,}")
# 출력: 숫자: 1,000,000
2.8.6 백분율 표시
백분율을 포매팅할 때는 %
기호를 사용할 수 있습니다.
- 백분율 포매팅:
score = 0.85
print(f"점수: {score:.2%}")
# 출력: 점수: 85.00%
여기서 :.2%
는 소수점 이하 두 자리까지 백분율로 표시하라는 의미입니다.
이제 파이썬에서 문자열을 다양한 방식으로 포매팅하는 방법을 이해하게 되었습니다. 이를 통해 더 명확하고 유연한 출력을 만들어낼 수 있습니다.