티스토리 뷰

반응형

[※ 주의 ※] 아래를 이해하지 않고 이 글을 볼 경우, 이해가 되지 않는 부분이 있을 수 있습니다.

 

1. [Python] 출력 함수 print()에 관한 모든 것 1


프로그래밍 언어마다 출력의 방식은 다르지만, 대부분 가독성이 좋게 출력된다. 직접 사용자가 줄 및 공백을 조절하여 출력할 수 있고, 혹은 다른 특별한 함수를 사용할 수 있다.

 

그러나, 출력에 한하여 파이썬과 다른 언어와의 가장 큰 차이점은, 다른 언어는 정렬을 대부분 문자열 포맷팅 혹은 줄바꿈, 공백으로 한다. 파이썬은 이를 자동으로 해주는 모듈이 있으니, pprint 모듈 되시겠다.

thumbnail
pprint를 활용하여 보자.

먼저, pprint는 pretty-print의 약자로, 말 그래도 "예쁘게 출력하기", 즉 가독성이 좋게 출력할 수 있게 해주는 모듈이다.


1. pprint

pprint 모듈은 파이썬에 기본적으로 내장되어 있는 모듈이며, 'import pprint'를 통해 pprint 모듈을 사용할 수 있다.

 

다음과 같은 매우 복잡한 dict 객체를 출력한다고 하였을 때, print 함수를 사용했을 때와 pprint를 사용하였을 때의 결과를 비교하면 다음과 같다.

 

먼저, print 함수를 사용하였을 때의 결과는 다음과 같다.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
lorem_ipsum = {
    'paragraph' : 2'title''lorem_ipsum',  'lang' : 'English''first' : 'Lorem ipsum dolor sit amet, consectetur '
                                                                            'adipiscing elit. Ut ornare blandit '
                                                                            'sapien. Integer eu sapien sed erat '
                                                                            'ultricies porttitor sed ac odio. '
                                                                            'Curabitur quis mauris tempor, '
                                                                            'gravida magna eget, finibus sem. Quisque '
                                                                            'a ipsum congue, mollis lectus vitae, '
                                                                            'aliquam arcu. Pellentesque viverra '
                                                                            'auctor efficitur. Nam tristique finibus '
                                                                            'mattis. Phasellus vitae scelerisque '
                                                                            'risus. Suspendisse potenti. Etiam '
                                                                            'dignissim erat at risus maximus, '
                                                                            'nec tincidunt elit euismod. Duis mollis '
                                                                            'ut felis at volutpat. Ut in consectetur '
                                                                            'sem.',
    'second' : 'Sed efficitur lobortis porttitor. Duis turpis metus, imperdiet at convallis id, faucibus ac quam. '
               'Pellentesque a hendrerit tortor, in fermentum nunc. Sed sit amet diam sed velit vehicula porta nec '
               'eget ipsum. ',
    'author' : 'unknown'
}
 
print(lorem_ipsum)
#{'paragraph': 2, 'title': 'lorem_ipsum', 'lang': 'English', 'first': 'Lorem ipsum dolor sit amet, consectetur adipiscing elit. Ut ornare blandit sapien. Integer eu sapien sed erat ultricies porttitor sed ac odio. Curabitur quis mauris tempor, gravida magna eget, finibus sem. Quisque a ipsum congue, mollis lectus vitae, aliquam arcu. Pellentesque viverra auctor efficitur. Nam tristique finibus mattis. Phasellus vitae scelerisque risus. Suspendisse potenti. Etiam dignissim erat at risus maximus, nec tincidunt elit euismod. Duis mollis ut felis at volutpat. Ut in consectetur sem.', 'second': 'Sed efficitur lobortis porttitor. Duis turpis metus, imperdiet at convallis id, faucibus ac quam. Pellentesque a hendrerit tortor, in fermentum nunc. Sed sit amet diam sed velit vehicula porta nec eget ipsum. ', 'author': 'unknown'}
cs

 

매우 가독성이 떨어지는 모습을 확인할 수 있다. 이번엔 pprint 모듈의 pprint를 활용하여 출력하여보자!

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
import pprint
 
lorem_ipsum = {
    'paragraph' : 2'title''lorem_ipsum',  'lang' : 'English''first' : 'Lorem ipsum dolor sit amet, consectetur '
                                                                            'adipiscing elit. Ut ornare blandit '
                                                                            'sapien. Integer eu sapien sed erat '
                                                                            'ultricies porttitor sed ac odio. '
                                                                            'Curabitur quis mauris tempor, '
                                                                            'gravida magna eget, finibus sem. Quisque '
                                                                            'a ipsum congue, mollis lectus vitae, '
                                                                            'aliquam arcu. Pellentesque viverra '
                                                                            'auctor efficitur. Nam tristique finibus '
                                                                            'mattis. Phasellus vitae scelerisque '
                                                                            'risus. Suspendisse potenti. Etiam '
                                                                            'dignissim erat at risus maximus, '
                                                                            'nec tincidunt elit euismod. Duis mollis '
                                                                            'ut felis at volutpat. Ut in consectetur '
                                                                            'sem.',
    'second' : 'Sed efficitur lobortis porttitor. Duis turpis metus, imperdiet at convallis id, faucibus ac quam. '
               'Pellentesque a hendrerit tortor, in fermentum nunc. Sed sit amet diam sed velit vehicula porta nec '
               'eget ipsum. ',
    'author' : 'unknown'
}
 
pprint.pprint(lorem_ipsum)
# {'author': 'unknown',
#  'first': 'Lorem ipsum dolor sit amet, consectetur adipiscing elit. Ut ornare '
#           'blandit sapien. Integer eu sapien sed erat ultricies porttitor sed '
#           'ac odio. Curabitur quis mauris tempor, gravida magna eget, finibus '
#           'sem. Quisque a ipsum congue, mollis lectus vitae, aliquam arcu. '
#           'Pellentesque viverra auctor efficitur. Nam tristique finibus '
#           'mattis. Phasellus vitae scelerisque risus. Suspendisse potenti. '
#           'Etiam dignissim erat at risus maximus, nec tincidunt elit euismod. '
#           'Duis mollis ut felis at volutpat. Ut in consectetur sem.',
#  'lang': 'English',
#  'paragraph': 2,
#  'second': 'Sed efficitur lobortis porttitor. Duis turpis metus, imperdiet at '
#            'convallis id, faucibus ac quam. Pellentesque a hendrerit tortor, '
#            'in fermentum nunc. Sed sit amet diam sed velit vehicula porta nec '
#            'eget ipsum. ',
#  'title': 'lorem_ipsum'}
cs

 

pprint 밑의 주석은 출력 그대로를 옮겨 놓은 것이다. 보다시피 한 눈에 알아볼 수 있도록 정렬을 한 모습을 볼 수 있다.


2. pprint.pprint

pprint 모듈안에는 여러 함수들이 있지만, 대부분의 경우 pprint 함수를 주로 사용하기에 이 함수를 중심으로 살펴볼 예정이다. 다른 함수에 대한 정보가 필요하거나, pprint의 생성자인 pprint.PrettyPrinter에 대한 정보가 더 필요할 경우  파이썬 공식문서에서 확인하면 된다.

 

pprint.pprint의 기본적인 꼴은 다음과 같다.

 

pprint.pprint(object, stream = None, indent = 1, width = 80, depth = None, compact = False, sort_dicts = True, underscore_numbers = False)

 

각 매개변수들을 알아보기 전에, 기본적인 pprint의 사용을 살펴보자. 밑의 코드는 PyPi에서의 샘플 json을 url을 통해 가져와 출력하는 예시이다. 기본적으로 pprint는 전체를 출력하기에 모두 읽을 필요는 없다.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
import json, pprint
from urllib.request import urlopen
pprint = pprint.pprint
 
with urlopen('https://pypi.org/pypi/sampleproject/json'as json_obj:
    project_releases_2 = json.load(json_obj)['releases']['2.0.0']
 
pprint(project_releases_2)
# [{'comment_text': '',
#   'digests': {'md5': '34b3750e8a39e7c2930cac64cd44ca0a',
#               'sha256': '2b0c55537193b792098977fdb62f0acbaeb2c3cfc56d0e24ccab775201462e04'},
#   'downloads': -1,
#   'filename': 'sampleproject-2.0.0-py3-none-any.whl',
#   'has_sig': False,
#   'md5_digest': '34b3750e8a39e7c2930cac64cd44ca0a',
#   'packagetype': 'bdist_wheel',
#   'python_version': 'py3',
#   'requires_python': '>=3.5, <4',
#   'size': 4209,
#   'upload_time': '2020-06-25T19:09:43',
#   'upload_time_iso_8601': '2020-06-25T19:09:43.103653Z',
#   'url': 'https://files.pythonhosted.org/packages/b8/f7/dd9223b39f683690c30f759c876df0944815e47b588cb517e4b9e652bcf7/sampleproject-2.0.0-py3-none-any.whl',
#   'yanked': False,
#   'yanked_reason': None},
#  {'comment_text': '',
#   'digests': {'md5': '7414660845e963b2a0e4d52c6d4a111f',
#               'sha256': 'd99de34ffae5515db43916ec47380d3c603e9dead526f96581b48c070cc816d3'},
#   'downloads': -1,
#   'filename': 'sampleproject-2.0.0.tar.gz',
#   'has_sig': False,
#   'md5_digest': '7414660845e963b2a0e4d52c6d4a111f',
#   'packagetype': 'sdist',
#   'python_version': 'source',
#   'requires_python': '>=3.5, <4',
#   'size': 7298,
#   'upload_time': '2020-06-25T19:09:43',
#   'upload_time_iso_8601': '2020-06-25T19:09:43.925879Z',
#   'url': 'https://files.pythonhosted.org/packages/8d/c7/bf2d01f14bc647c4ef2299dec830560a9b55a582ecf9e0e43af740c79ccd/sampleproject-2.0.0.tar.gz',
#   'yanked': False,
#   'yanked_reason': None}]
cs

 

1) stream = None

stream은 출력을 지정해주는 방식이다. print 함수에서의 file 매개변수와 같은 역할을 한다. 기본값과 None은 sys.stdout(콘솔 출력)을 사용한다. 무슨 말인지 모르겠다면 맨 위의 을 읽어보자.


2) indent = 1

indent는 이중 list와 같이 여러 데이터가 중첩될 때, 각 중첩 시작 시 간격을 얼마로 할 것인지에 대한 매개변수이다. 기본값은 한 칸이다. 만약 음수가 입력된다면 ValueError를 띄운다.

 

만약 indent에 4라는 값을 넣어준다면, 다음과 같이 중첩된 dict에서 칸이 더 띄워지는 모습을 확인할 수 있다.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
import json, pprint
from urllib.request import urlopen
pprint = pprint.pprint
 
with urlopen('https://pypi.org/pypi/sampleproject/json'as json_obj:
    project_releases_2 = json.load(json_obj)['releases']['2.0.0']
 
pprint(project_releases_2, indent = 4)
# [   {   'comment_text': '',
#         'digests': {   'md5': '34b3750e8a39e7c2930cac64cd44ca0a',
#                        'sha256': '2b0c55537193b792098977fdb62f0acbaeb2c3cfc56d0e24ccab775201462e04'},
#         'downloads': -1,
#         'filename': 'sampleproject-2.0.0-py3-none-any.whl',
#         'has_sig': False,
#         'md5_digest': '34b3750e8a39e7c2930cac64cd44ca0a',
#         'packagetype': 'bdist_wheel',
#         'python_version': 'py3',
#         'requires_python': '>=3.5, <4',
#         'size': 4209,
#         'upload_time': '2020-06-25T19:09:43',
#         'upload_time_iso_8601': '2020-06-25T19:09:43.103653Z',
#         'url': 'https://files.pythonhosted.org/packages/b8/f7/dd9223b39f683690c30f759c876df0944815e47b588cb517e4b9e652bcf7/sampleproject-2.0.0-py3-none-any.whl',
#         'yanked': False,
#         'yanked_reason': None},
#     {   'comment_text': '',
#         'digests': {   'md5': '7414660845e963b2a0e4d52c6d4a111f',
#                        'sha256': 'd99de34ffae5515db43916ec47380d3c603e9dead526f96581b48c070cc816d3'},
#         'downloads': -1,
#         'filename': 'sampleproject-2.0.0.tar.gz',
#         'has_sig': False,
#         'md5_digest': '7414660845e963b2a0e4d52c6d4a111f',
#         'packagetype': 'sdist',
#         'python_version': 'source',
#         'requires_python': '>=3.5, <4',
#         'size': 7298,
#         'upload_time': '2020-06-25T19:09:43',
#         'upload_time_iso_8601': '2020-06-25T19:09:43.925879Z',
#         'url': 'https://files.pythonhosted.org/packages/8d/c7/bf2d01f14bc647c4ef2299dec830560a9b55a582ecf9e0e43af740c79ccd/sampleproject-2.0.0.tar.gz',
#         'yanked': False,
#         'yanked_reason': None}]
cs

3) width = 80

width는 각 줄마다 최대 몇 글자를 사용할지 정하여주는 매개변수이다. 만약, 콘솔 창에 알맞게 들어가지 않는다면, 파이썬에서 자동으로 최적화하여준다. 기본값은 80자이다. 만약 0이라면 ValueError를 띄운다.

 

만약 width = 20으로 각 줄의 최대글자를 20으로 맞추면, 다음과 같이 출력에서 몇몇 항목이 글자 수 제한으로 인하여 줄바꿈 된 것을 확인할 수 있다.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
import json, pprint
from urllib.request import urlopen
pprint = pprint.pprint
 
with urlopen('https://pypi.org/pypi/sampleproject/json'as json_obj:
    project_releases_2 = json.load(json_obj)['releases']['2.0.0']
 
pprint(project_releases_2, width = 20)
# [{'comment_text': '',
#   'digests': {'md5': '34b3750e8a39e7c2930cac64cd44ca0a',
#               'sha256': '2b0c55537193b792098977fdb62f0acbaeb2c3cfc56d0e24ccab775201462e04'},
#   'downloads': -1,
#   'filename': 'sampleproject-2.0.0-py3-none-any.whl',
#   'has_sig': False,
#   'md5_digest': '34b3750e8a39e7c2930cac64cd44ca0a',
#   'packagetype': 'bdist_wheel',
#   'python_version': 'py3',
#   'requires_python': '>=3.5, '
#                      '<4',
#   'size': 4209,
#   'upload_time': '2020-06-25T19:09:43',
#   'upload_time_iso_8601': '2020-06-25T19:09:43.103653Z',
#   'url': 'https://files.pythonhosted.org/packages/b8/f7/dd9223b39f683690c30f759c876df0944815e47b588cb517e4b9e652bcf7/sampleproject-2.0.0-py3-none-any.whl',
#   'yanked': False,
#   'yanked_reason': None},
#  {'comment_text': '',
#   'digests': {'md5': '7414660845e963b2a0e4d52c6d4a111f',
#               'sha256': 'd99de34ffae5515db43916ec47380d3c603e9dead526f96581b48c070cc816d3'},
#   'downloads': -1,
#   'filename': 'sampleproject-2.0.0.tar.gz',
#   'has_sig': False,
#   'md5_digest': '7414660845e963b2a0e4d52c6d4a111f',
#   'packagetype': 'sdist',
#   'python_version': 'source',
#   'requires_python': '>=3.5, '
#                      '<4',
#   'size': 7298,
#   'upload_time': '2020-06-25T19:09:43',
#   'upload_time_iso_8601': '2020-06-25T19:09:43.925879Z',
#   'url': 'https://files.pythonhosted.org/packages/8d/c7/bf2d01f14bc647c4ef2299dec830560a9b55a582ecf9e0e43af740c79ccd/sampleproject-2.0.0.tar.gz',
#   'yanked': False,
#   'yanked_reason': None}]
 
cs

4) depth = None

depth는 중첩된 항목이 있을 때 중첩 깊이를 제한하는 항목이다. 만약 중첩 깊이 제한보다 더 깊은 데이터가 있다면, 데이터 대신 {...} 항목으로 출력이 바뀐다. 기본값으론 제한이 없다. 만약 depth가 음수라면 ValueError를 띄운다.

 

만약 depth = 2로 한 번의 중첩만 출력되도록 한다면 'digests'와 같은 깊은 항목들은 {...}으로 변한 모습을 확인할 수 있다.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
import json, pprint
from urllib.request import urlopen
pprint = pprint.pprint
 
with urlopen('https://pypi.org/pypi/sampleproject/json'as json_obj:
    project_releases_2 = json.load(json_obj)['releases']['2.0.0']
 
pprint(project_releases_2, depth = 2)
# [{'comment_text': '',
#   'digests': {...},
#   'downloads': -1,
#   'filename': 'sampleproject-2.0.0-py3-none-any.whl',
#   'has_sig': False,
#   'md5_digest': '34b3750e8a39e7c2930cac64cd44ca0a',
#   'packagetype': 'bdist_wheel',
#   'python_version': 'py3',
#   'requires_python': '>=3.5, <4',
#   'size': 4209,
#   'upload_time': '2020-06-25T19:09:43',
#   'upload_time_iso_8601': '2020-06-25T19:09:43.103653Z',
#   'url': 'https://files.pythonhosted.org/packages/b8/f7/dd9223b39f683690c30f759c876df0944815e47b588cb517e4b9e652bcf7/sampleproject-2.0.0-py3-none-any.whl',
#   'yanked': False,
#   'yanked_reason': None},
#  {'comment_text': '',
#   'digests': {...},
#   'downloads': -1,
#   'filename': 'sampleproject-2.0.0.tar.gz',
#   'has_sig': False,
#   'md5_digest': '7414660845e963b2a0e4d52c6d4a111f',
#   'packagetype': 'sdist',
#   'python_version': 'source',
#   'requires_python': '>=3.5, <4',
#   'size': 7298,
#   'upload_time': '2020-06-25T19:09:43',
#   'upload_time_iso_8601': '2020-06-25T19:09:43.925879Z',
#   'url': 'https://files.pythonhosted.org/packages/8d/c7/bf2d01f14bc647c4ef2299dec830560a9b55a582ecf9e0e43af740c79ccd/sampleproject-2.0.0.tar.gz',
#   'yanked': False,
#   'yanked_reason': None}]
cs

5) compact = False

파이썬 3.4에 추가된 매개변수로, compact는 list, tuple, set와 같은 긴 sequence를 하나씩 출력할 것인지 아닌지를 정해주는 매개변수이다. 만약 True라면, width 제한까지 한 줄로 출력하고, False라면 각 항목마다 줄바꿈을 넣어서 출력한다. 기본값은 False이다.


6) sort_dicts = True

파이썬 3.8에 추가된 매개변수로, sort_dicts는 출력 시 사전식 배열순으로 출력할지 정해주는 매개변수이다. 만약 True라면 사전식 배열 순으로 출력하고, False라면 본래의 순서를 유지한 채로 출력한다. 이때 정렬 기준은 key를 우선적으로 한다. 기본값은 True이다.


7) underscore_numbers = False

파이썬 3.10에 추가된 매개변수로, underscore_numbers는 긴 숫자 출력시 매 4번째 자리마다 밑줄('_')을 추가할지 정해주는 매개변수이다. 만약 True라면 밑줄이 추가되고, False라면 본래 숫자대로 출력을 한다.


3. pprint는 어디에 쓰나?

사실 콘솔 이외에 곳에 출력할 일이 없으면 잘 사용되지 않는 라이브러리이지만, 디버깅 시 pprint를 통해 더 빠르고 쉽게 오류난 부분을 확인할 수 있다. 특히, 위의 예제처럼 json을 출력할 때 유용하게 사용할 수 있는 라이브러리이다. 

반응형
댓글
Total
Today
Yesterday
공지사항
최근에 올라온 글
최근에 달린 댓글
링크
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함