파이썬 입출력 — 출력 포맷과 파일 다루기

파이썬 입출력 — 출력 포맷과 파일 다루기

프로그램의 출력을 어떻게 보여줄지는 항상 고민거리예요. 사람이 읽기 좋은 형태로 콘솔에 출력할 수도 있고, 나중에 쓰기 위해 파일에 저장할 수도 있어요. 파이썬은 이 두 경우 모두 여러 방법을 제공해요. 이 장은 그 방법들을 차례로 다뤄요.

출처: 7. Input and Output

출력 포맷 꾸미기

지금까지는 표현식 문장과 print() 함수로 값을 출력했어요. 이제 출력을 더 잘 제어하고 싶다면 여러 방법이 있어요.

**포맷 문자열 리터럴(f-string)**은 문자열을 fF로 시작하면 돼요. 그 안에서 {} 사이에 파이썬 표현식을 써서 변수나 리터럴 값을 끼워 넣을 수 있어요.

>>> year = 2016
>>> event = 'Referendum'
>>> f'Results of the {year} {event}'
'Results of the 2016 Referendum'

문자열의 str.format() 메서드는 더 수동적이에요. 여전히 {}로 대입 위치를 표시하고 세부 포맷 지시를 줄 수 있지만, 직접 정보를 채워야 해요.

>>> yes_votes = 42_572_654
>>> total_votes = 85_705_149
>>> percentage = yes_votes / total_votes
>>> '{:-9} YES votes  {:2.2%}'.format(yes_votes, percentage)
' 42572654 YES votes  49.67%'

f-string에선 포맷 지정자로 값을 다듬을 수 있어요. 예를 들어 원주율을 소수 세 자리로 반올림하려면 .3f를 붙여요. : 뒤에 정수를 넘기면 그 필드의 최소 너비가 돼서 컬럼을 맞추는 데 유용해요.

>>> import math
>>> print(f'The value of pi is approximately {math.pi:.3f}.')
The value of pi is approximately 3.142.

>>> table = {'Sjoerd': 4127, 'Jack': 4098, 'Dcab': 7678}
>>> for name, phone in table.items():
...     print(f'{name:10} ==> {phone:10d}')
...
Sjoerd     ==>       4127
Jack       ==>       4098
Dcab       ==>       7678

화려한 포맷이 필요 없고 디버깅용으로 값을 빠르게 보여주고 싶다면, str()이나 repr() 함수로 어떤 값이든 문자열로 바꿀 수 있어요. str()은 사람이 읽기 좋은 표현을, repr()은 인터프리터가 읽을 수 있는 표현(그에 상응하는 문법이 없으면 SyntaxError를 부르는)을 만들어요. 문자열처럼 두 표현이 다른 값도 있어요.

>>> s = 'Hello, world.'
>>> str(s)
'Hello, world.'
>>> repr(s)
"'Hello, world.'"

파일 읽고 쓰기

open()으로 파일을 열어 텍스트를 쓰고 읽을 수 있어요. 예를 들어 객체 x의 JSON 문자열 표현을 한 줄로 볼 수 있어요.

>>> import json
>>> x = [1, 'simple', 'list']
>>> json.dumps(x)
'[1, "simple", "list"]'

json.dump(x, f)는 객체를 텍스트 파일로 직렬화하고, json.load(f)는 다시 읽어 들여요.

json.dump(x, f)
x = json.load(f)

JSON 파일은 반드시 UTF-8로 인코딩해야 해요. 읽기·쓰기 모두 텍스트 파일로 열 때 encoding="utf-8"을 지정해요. 이 구조는 리스트와 딕셔너리를 다룰 수 있지만, 임의의 클래스 인스턴스를 JSON으로 직렬화하려면 추가 작업이 필요해요.

json과 달리 pickle은 임의로 복잡한 파이썬 객체까지 직렬화할 수 있는 프로토콜이에요. 다만 파이썬 전용이라 다른 언어와 통신은 못 하고, 기본적으로 안전하지 않아요. 신뢰할 수 없는 출처의 pickle 데이터를 역직렬화하면 공격자가 조작한 코드가 실행될 수 있으니 주의해야 해요.

더 알아보기