파이썬 print 변수 공백 제어 완벽 가이드

print 함수로 여러 변수를 출력할 때 자동으로 공백이 들어가는 것이 불편하신가요? 변수들을 붙여서 출력하거나, 구분자를 커스터마이징하고 싶으신가요? 이 글에서는 print 함수의 sep 매개변수와 다양한 출력 포맷팅 방법을 완벽하게 알려드립니다.

print 함수의 기본 동작

기본 공백 출력

# 기본적으로 변수 사이에 공백이 자동 삽입
name = "홍길동"
age = 25
city = "서울"

print(name, age, city)
# 출력: 홍길동 25 서울
# 자동으로 공백이 들어감

기본 동작: print는 여러 인자 사이에 자동으로 공백(space)을 넣습니다.

sep 매개변수로 구분자 변경

공백 제거 (붙여서 출력)

name = "Python"
version = 3
year = 2025

# 기본 출력 (공백 있음)
print(name, version, year)
# Python 3 2025

# sep='' 로 공백 제거
print(name, version, year, sep='')
# Python32025

# 실용 예제
print("총", 100, "개", sep='')
# 총100개

sep=’’: 구분자를 빈 문자열로 설정하면 공백 없이 붙여서 출력됩니다.

다양한 구분자 사용

# 쉼표로 구분
print("사과", "바나나", "포도", sep=', ')
# 사과, 바나나, 포도

# 대시로 구분
print("2025", "10", "08", sep='-')
# 2025-10-08

# 슬래시로 구분
print("홍길동", "개발자", "서울", sep=' / ')
# 홍길동 / 개발자 / 서울

# 줄바꿈으로 구분
print("첫째", "둘째", "셋째", sep='\\\\n')
# 첫째
# 둘째
# 셋째

# 탭으로 구분
print("이름", "나이", "직업", sep='\\\\t')
# 이름	나이	직업

실전 활용 예제

# 파일 경로 생성
folder = "documents"
subfolder = "reports"
filename = "2025.txt"

print(folder, subfolder, filename, sep='/')
# documents/reports/2025.txt

# 전화번호 포맷
area = "010"
middle = "1234"
last = "5678"

print(area, middle, last, sep='-')
# 010-1234-5678

# URL 생성
domain = "example.com"
path = "api"
endpoint = "users"

print("https://", domain, "/", path, "/", endpoint, sep='')
# <https://example.com/api/users>

# CSV 형식
name = "홍길동"
age = 28
job = "개발자"

print(name, age, job, sep=',')
# 홍길동,28,개발자

end 매개변수로 줄바꿈 제어

줄바꿈 제거

# 기본 출력 (자동 줄바꿈)
print("첫 번째")
print("두 번째")
# 첫 번째
# 두 번째

# end='' 로 줄바꿈 제거
print("첫 번째", end='')
print("두 번째")
# 첫 번째두 번째

# 공백으로 연결
print("첫 번째", end=' ')
print("두 번째")
# 첫 번째 두 번째

진행률 표시

import time

# 같은 줄에 계속 출력
for i in range(1, 101):
    print(f"\\\\r진행률: {i}%", end='')
    time.sleep(0.05)

print()  # 마지막에 줄바꿈
# 진행률: 100%

\r (캐리지 리턴): 커서를 줄 처음으로 이동해 덮어쓰기

로딩 애니메이션

import time

loading_chars = ['|', '/', '-', '\\\\\\\\']

for i in range(20):
    print(f"\\\\r처리 중... {loading_chars[i % 4]}", end='')
    time.sleep(0.2)

print("\\\\n완료!")
# 처리 중... | (회전하는 애니메이션)
# 완료!

sep와 end 동시 사용

# sep와 end 조합
print("Python", 3.12, sep='', end=' | ')
print("Django", 5.0, sep='', end=' | ')
print("Flask", 3.0, sep='')
# Python3.12 | Django5.0 | Flask3.0

# 한 줄 테이블
print("이름", "나이", "직업", sep='\\\\t', end='\\\\n')
print("홍길동", 28, "개발자", sep='\\\\t', end='\\\\n')
print("김철수", 32, "디자이너", sep='\\\\t')
# 이름	나이	직업
# 홍길동	28	개발자
# 김철수	32	디자이너

포맷팅 방법 비교

1. f-string (Python 3.6+, 권장)

name = "홍길동"
age = 28
city = "서울"

# 공백 제어가 자유로움
print(f"{name}{age}{city}")
# 홍길동28서울

print(f"{name} {age} {city}")
# 홍길동 28 서울

print(f"{name}, {age}세, {city}")
# 홍길동, 28세, 서울

# 표현식 포함
print(f"{name}님은 {age+2}년 후 {age+2}세가 됩니다")
# 홍길동님은 2년 후 30세가 됩니다

장점: 가장 직관적이고 강력함

2. % 포맷팅 (레거시)

name = "홍길동"
age = 28

# 공백 없이
print("%s%d" % (name, age))
# 홍길동28

# 공백 포함
print("%s %d" % (name, age))
# 홍길동 28

# 포맷 지정
print("%s님은 %d세입니다" % (name, age))
# 홍길동님은 28세입니다

3. str.format()

name = "홍길동"
age = 28

# 공백 없이
print("{}{}".format(name, age))
# 홍길동28

# 공백 포함
print("{} {}".format(name, age))
# 홍길동 28

# 인덱스 지정
print("{0}님은 {1}세, {0}은 개발자".format(name, age))
# 홍길동님은 28세, 홍길동은 개발자

# 이름 지정
print("{name}님은 {age}세입니다".format(name=name, age=age))
# 홍길동님은 28세입니다

4. 문자열 연결 (+)

name = "홍길동"
age = 28

# 타입 변환 필요
print(name + str(age))
# 홍길동28

# 공백 추가
print(name + " " + str(age))
# 홍길동 28

# 복잡한 문자열
print(name + "님은 " + str(age) + "세입니다")
# 홍길동님은 28세입니다

단점: 타입 변환이 번거롭고 가독성이 떨어짐

실전 활용 예제

예제 1: 테이블 형식 출력

# 헤더
print("이름", "나이", "직업", "도시", sep='\\\\t')
print("-" * 40)

# 데이터
data = [
    ("홍길동", 28, "개발자", "서울"),
    ("김철수", 32, "디자이너", "부산"),
    ("이영희", 25, "기획자", "대전")
]

for row in data:
    print(*row, sep='\\\\t')

# 출력:
# 이름	나이	직업	도시
# ----------------------------------------
# 홍길동	28	개발자	서울
# 김철수	32	디자이너	부산
# 이영희	25	기획자	대전

  • row: 튜플을 언패킹해 각 요소를 개별 인자로 전달

예제 2: CSV 파일 생성

# CSV 형식으로 출력
print("이름,나이,이메일")

users = [
    ("홍길동", 28, "hong@example.com"),
    ("김철수", 32, "kim@example.com"),
    ("이영희", 25, "lee@example.com")
]

for user in users:
    print(*user, sep=',')

# 출력:
# 이름,나이,이메일
# 홍길동,28,hong@example.com
# 김철수,32,kim@example.com
# 이영희,25,lee@example.com

# 파일로 저장
with open('users.csv', 'w', encoding='utf-8') as f:
    print("이름,나이,이메일", file=f)
    for user in users:
        print(*user, sep=',', file=f)

예제 3: 진행 상황 표시

import time

def download_simulation():
    total = 100

    for i in range(total + 1):
        percent = i
        bar = '█' * (i // 2)
        spaces = ' ' * ((100 - i) // 2)

        print(f"\\\\r[{bar}{spaces}] {percent}%", end='')
        time.sleep(0.05)

    print()  # 완료 후 줄바꿈

download_simulation()
# [██████████████████████████████████████████████████] 100%

예제 4: 로그 메시지

from datetime import datetime

def log_message(level, message):
    timestamp = datetime.now().strftime('%Y-%m-%d %H:%M:%S')
    print('[', timestamp, ']', '[', level, ']', message, sep='')

# 사용
log_message('INFO', '프로그램 시작')
log_message('WARNING', '메모리 사용량 80% 초과')
log_message('ERROR', '데이터베이스 연결 실패')

# 출력:
# [2025-10-08 14:30:25][INFO]프로그램 시작
# [2025-10-08 14:30:26][WARNING]메모리 사용량 80% 초과
# [2025-10-08 14:30:27][ERROR]데이터베이스 연결 실패

예제 5: 파일 경로 생성

import os

def create_path(*parts):
    """여러 경로 요소를 결합"""
    # Windows: \\\\, Linux/Mac: /
    print(*parts, sep=os.sep)

# 사용
create_path('Users', 'username', 'Documents', 'project', 'data.txt')
# Windows: Users\\\\username\\\\Documents\\\\project\\\\data.txt
# Linux/Mac: Users/username/Documents/project/data.txt

# 또는 직접 지정
print('home', 'user', 'files', sep='/')
# home/user/files

예제 6: 태그 생성

def generate_html_tag(tag, content):
    """HTML 태그 생성"""
    print('<', tag, '>', content, '</', tag, '>', sep='')

# 사용
generate_html_tag('h1', 'Welcome')
generate_html_tag('p', 'This is a paragraph')
generate_html_tag('a', 'Click here')

# 출력:
# <h1>Welcome</h1>
# <p>This is a paragraph</p>
# <a>Click here</a>

고급 활용

조건부 구분자

def print_list(items, compact=False):
    """리스트를 다양한 형식으로 출력"""
    if compact:
        print(*items, sep='')
    else:
        print(*items, sep=', ')

# 사용
fruits = ['사과', '바나나', '포도']

print_list(fruits, compact=False)
# 사과, 바나나, 포도

print_list(fruits, compact=True)
# 사과바나나포도

동적 구분자

def print_with_separator(items, separator=' | '):
    """커스텀 구분자로 출력"""
    print(*items, sep=separator)

# 사용
data = ['Python', 'Django', 'Flask', 'FastAPI']

print_with_separator(data)
# Python | Django | Flask | FastAPI

print_with_separator(data, separator=' → ')
# Python → Django → Flask → FastAPI

print_with_separator(data, separator='\\\\n- ')
# Python
# - Django
# - Flask
# - FastAPI

정렬된 출력

def print_aligned(label, value, width=20):
    """레이블과 값을 정렬해서 출력"""
    print(f"{label:<{width}}", value, sep=': ')

# 사용
print_aligned('이름', '홍길동')
print_aligned('나이', 28)
print_aligned('이메일', 'hong@example.com')
print_aligned('전화번호', '010-1234-5678')

# 출력:
# 이름                : 홍길동
# 나이                : 28
# 이메일              : hong@example.com
# 전화번호            : 010-1234-5678

성능 비교

import time

# 1. print with sep
start = time.time()
for i in range(100000):
    print('a', 'b', 'c', sep='', end='')
print()
print(f"sep 방식: {time.time() - start:.4f}초")

# 2. f-string
start = time.time()
for i in range(100000):
    print(f"{'a'}{'b'}{'c'}", end='')
print()
print(f"f-string: {time.time() - start:.4f}초")

# 3. 문자열 연결
start = time.time()
for i in range(100000):
    print('a' + 'b' + 'c', end='')
print()
print(f"문자열 연결: {time.time() - start:.4f}초")

결과: f-string이 가장 빠르고, sep 방식도 충분히 효율적

자주 하는 실수

실수 1: 타입 오류

# 잘못된 예
name = "홍길동"
age = 28

# print(name + age)  # TypeError!

# 올바른 예
print(name, age)  # sep 사용
# 홍길동 28

print(f"{name}{age}")  # f-string 사용
# 홍길동28

print(name + str(age))  # 타입 변환
# 홍길동28

실수 2: sep 위치

# 잘못된 예
# print(sep='', "a", "b", "c")  # SyntaxError!

# 올바른 예
print("a", "b", "c", sep='')
# abc

키워드 인자는 항상 마지막에

실수 3: 불필요한 변환

# 비효율적
x = 100
y = 200
print(str(x) + str(y))

# 효율적
print(x, y, sep='')
# 100200

# 더 나은 방법
print(f"{x}{y}")
# 100200

파일 출력

# 파일에 출력할 때도 sep 사용 가능
with open('output.txt', 'w', encoding='utf-8') as f:
    print('Python', 3.12, 'Django', 5.0, sep=', ', file=f)
    print('데이터', '분석', '머신러닝', sep=' | ', file=f)

# output.txt 내용:
# Python, 3.12, Django, 5.0
# 데이터 | 분석 | 머신러닝

마치며

print 함수의 sep='' 매개변수로 변수 사이의 공백을 제거하고, sep=', '로 구분자를 커스터마이징할 수 있습니다. end=''로 줄바꿈도 제어 가능하며, f-string과 조합하면 더욱 강력한 출력 포맷팅이 가능합니다.

테이블 형식 출력, CSV 생성, 로그 메시지, 진행률 표시 등 다양한 실무 상황에서 sep와 end를 활용해보세요. 가독성과 효율성을 동시에 높일 수 있습니다!


참고 자료

댓글 남기기