입력과 출력

프로그램을 만들다 보면 간혹 프로그램이 사용자와 상호 작용을 해야 할 때가 있을 것입니다. 예를 들어, 사용자로부터 뭔가를 입력받고 처리 결과를 출력해 주는 것 같은 일이 필요할 때입니다. 파이썬에서는 이를 위해 각각 input() 함수와 print 문을 사용합니다.

결과를 출력해주기 위해서는 str (문자열) 클래스가 제공하는 여러 메소드를 사용할 수도 있습니다. 예를 들면, rjust 메소드를 사용하여 출력될 문자열이 특정 폭의 문자열 안에서 오른쪽 정렬되도록 할 수 있습니다. help(str) 을 실행하여 이들에 대해 자세히 알아보시기 바랍니다.

또 다른 입/출력의 형식은 파일을 다루는 것입니다. 파일을 생성하고, 읽고, 쓰는 것은 많은 프로그램에서 중요한 부분을 차지하고 있으며 이 챕터에서는 이러한 기능에 대해 자세히 알아보게 될 것입니다.

사용자로부터 입력받기

io_input.py 로 저장하세요:

def reverse(text):
    return text[::-1]


def is_palindrome(text):
    return text == reverse(text)


something = input("Enter text: ")
if is_palindrome(something):
    print("Yes, it is a palindrome")
else:
    print("No, it is not a palindrome")

실행 결과:

$ python3 io_input.py
Enter text: sir
No, it is not a palindrome

$ python3 io_input.py
Enter text: madam
Yes, it is a palindrome

$ python3 io_input.py
Enter text: racecar
Yes, it is a palindrome

동작 원리

문자열을 뒤집기 위해서는 슬라이스를 사용합니다. 앞서 보았듯이 열거형의 슬라이스 기능을 활용하여 seq[a:b] 와 같은 코드를 통해 위치 a 부터 위치 b 까지 문자열을 얻어올 수 있습니다. 슬라이스 숫자에 세 번째 인수를 넘겨 주어 슬라이스 스텝 을 지정해줄 수 있습니다. 스텝을 지정하지 않으면 기본값 1 이 지정되며, 이 경우 지정된 문자열을 차례로 슬라이스 하는 것을 의미합니다. 음의 스텝을 지정하면 열거형의 마지막부터 반대 방향으로 슬라이스가 진행되며, 예를 들어 -1 을 지정하면 뒤집혀진 문자열이 반환됩니다.

input() 함수는 인수로 넘겨받은 문자열을 화면에 표시해 줍니다. 그리고 나서는 사용자가 사용자가 무언가를 입력하고 Enter 키를 누를 때까지 기다립니다. 사용자가 입력을 마치고 Enter 키를 누르면 input() 함수는 사용자가 입력한 내용을 문자열로 반환해 줍니다.

이제 이 문자열을 받아서 뒤집어 줍니다 (참고로 여기서 뒤집혀진 문자열이 뒤집혀지지 않았을 때의 문자열과 동일한 경우를 영어로 palindrome 이라고 부릅니다).

연습 문제

어떤 문자열이 palindrome이라고 하는 것은 그 안에 포함된 문장 부호들과 공백 등을 제외한 문자들을 가지고서 판단해야 합니다. 예를 들어, "Rise to vote, sir." 은 palindrome의 한 예이지만 위 예제 프로그램은 이것은 palindrome이 아니라고 판단할 것입니다. 위 프로그램을 고쳐서 이러한 문자열들을 palindrome으로 인식할 수 있는 프로그램을 작성해 보시기 바랍니다.

힌트가 필요하시면 주석을 읽어 보세요... 1

파일 입/출력

입/출력을 위해 파일을 열고 사용하려면 file 클래스의 객체를 생성한 후 read, readline, write 와 같은 메소드들을 적절히 활용하면 됩니다. 파일을 열때 파일을 읽는 모드와 쓰는 모드를 따로 지정해 줄 수 있습니다. 마지막으로 파일을 읽거나 쓰는 일을 모두 마친 후에는, close 메소드를 호출하여 파이썬에게 파일 사용을 마쳤으니 이제 파일을 닫으라고 해 주어야 합니다.

예제 (io_using_file.py 로 저장하세요):

poem = '''\
Programming is fun
When the work is done
if you wanna make your work also fun:
    use Python!
'''

# Open for 'w'riting
f = open('poem.txt', 'w')
# Write text to file
f.write(poem)
# Close the file
f.close()

# If no mode is specified,
# 'r'ead mode is assumed by default
f = open('poem.txt')
while True:
    line = f.readline()
    # Zero length indicates EOF
    if len(line) == 0:
        break
    # The `line` already has a newline
    # at the end of each line
    # since it is reading from a file.
    print(line, end='')
# close the file
f.close()

실행 결과:

$ python3 io_using_file.py
Programming is fun
When the work is done
if you wanna make your work also fun:
    use Python!

동작 원리

먼저, 내장 함수 open 을 이용하여 파일을 열어 줍니다. 이 때 파일을 어떤 용도로 사용할 것인지도 함께 지정해 줍니다. 각 모드로는 읽기 모드 ('r'), 쓰기 모드 ('w'), 덧붙임 모드 ('a') 등이 있습니다. 또한 우리가 다룰 파일을 일반적인 텍스트 모드 ('t') 로 다룰 지 또는 바이너리 모드 ('b') 로 다룰 지 여부도 함께 지정해 줄 수 있습니다. 이외에도 여러가지 다른 모드들이 있으며, help(open) 을 통해 그 목록을 확인해 볼 수 있습니다. 모드에 아무것도 지정하지 않으면, open() 은 기본적으로 파일을 텍스트('t'ext) 파일을 읽는 ('r'ead) 모드로 파일을 열어 줍니다.

위 예제에서는 먼저 파일을 쓰기/텍스트 모드로 열고 파일 객체의 write 메소드를 사용하여 파일에 문자열 변수 poem 에 들어 있는 텍스트를 써준 후 close 로 파일을 닫아 줍니다.

다음으로는, 똑같은 파일을 이번에는 읽기 모드로 엽니다. 이 때 아무 모드도 지정하지 않았는데 이렇게 하면 기본값인 '읽기/텍스트 모드' 가 지정됩니다. 파일을 연 후에는 반복문을 이용하여 파일의 readline 메소드를 통해 파일의 내용을 한 줄씩 읽어옵니다. 이 메소드는 파일 내용을 읽다가 줄바꿈 문자를 만날 때까지 한 줄을 읽어서 그 모든 내용을 반환해 줍니다. 만약 문자열이 반환되었을 경우, 이것은 파일의 끝임을 의미하는 것이므로 'break' 문을 통해 반복문을 빠져 나옵니다.

마지막으로, close 문으로 파일을 닫습니다.

이제 readline 의 출력 결과를 통해 예제 프로그램이 poem.txt 파일에 올바른 내용을 쓰고 읽어들였는지를 다시 한번 확인해 보시기 바랍니다.

피클 (Pickle)

파이썬은 pickle 이라고 불리우는 모듈을 기본으로 제공하는데, 이것은 어떤 파이썬 객체이든지 파일로 저장해 두었다가 나중에 불러와서 사용할 수 있게 하는, 즉 객체를 영구히 저장해 두는 방법을 제공해 주는 모듈입니다.

예제 (io_pickle.py 로 저장하세요):

import pickle

# The name of the file where we will store the object
shoplistfile = 'shoplist.data'
# The list of things to buy
shoplist = ['apple', 'mango', 'carrot']

# Write to the file
f = open(shoplistfile, 'wb')
# Dump the object to a file
pickle.dump(shoplist, f)
f.close()

# Destroy the shoplist variable
del shoplist

# Read back from the storage
f = open(shoplistfile, 'rb')
# Load the object from the file
storedlist = pickle.load(f)
print(storedlist)
f.close()

실행 결과:

$ python io_pickle.py
['apple', 'mango', 'carrot']

동작 원리

파일에 객체를 저장하기 위해서 먼저 open 문을 이용하여 쓰기 (w)바이너리 (b) 모드로 파일을 열어 준 후 pickle 모듈의 dump 함수를 호출하여 줍니다. 이 과정을 피클링 (pickling) 이라고 합니다.

다음으로 pickle 모듈의 load 함수를 이용하여 파일에 저장된 객체를 불러옵니다. 이 과정을 언피클링(unpickling) 이라고 합니다.

유니코드

지금까지 우리가 문자열을 화면이나 파일에 쓰거나 읽을 때 영어 알파벳 문자들만을 주로 이용해 왔습니다. 여러분이 영어가 아닌 다른 언어로 된 문자를 읽고 쓰게 될 경우, 파이썬은 이러한 문자들을 유니코드로 표현하는데 (이에 대한 좀 더 자세한 정보는 이 섹션의 마지막 부분에 있는 여러 글들을 읽어 보세요), 파이썬 3은 기본적으로 문자열 변수들에 저장된 값들 (예를 들어 작은 따옴표, 큰 따옴표, 따옴표 세 개를 활용한 문자열들)을 모두 유니코드로 표현합니다. 이 아래부터는 파이썬 2에 해당하는 설명입니다.

NOTE: 만약 여러분이 파이썬 2를 사용중이며 영어가 아닌 문자를 표현해야 할 경우 unicode 형식을 이용할 필요가 있으며, 이것은 문자 u 를 앞에 붙여 주어 지정해 줍니다. 예를 들어 u"hello world" 와 같이 합니다.

>>> "hello world"
'hello world'
>>> type("hello world")
<class 'str'>
>>> u"hello world"
'hello world'
>>> type(u"hello world")
<class 'str'>

특히 데이터가 인터넷을 통해 전송될 때, 이러한 데이터는 컴퓨터가 쉽게 알아들을 수 있는 형식인 바이트 형식을 통해 전송됩니다. 이 때, 유니코드 (파이썬이 문자열을 저장하는 방식) 에서 바이트로 변환하는 것을 인코딩 이라고 합니다. 현재 많이 쓰이는 인코딩의 예는 UTF-8 입니다. open 함수에 간단히 키워드 인자를 하나 넘겨주는 것을 통해 UTF-8 로 파일을 읽고 쓸 수 있습니다:

# encoding=utf-8
import io

f = io.open("abc.txt", "wt", encoding="utf-8")
f.write(u"Imagine non-English language here")
f.close()

text = io.open("abc.txt", encoding="utf-8").read()
print(text)

동작 원리

이 예제에서는 io.open 을 활용하며, 첫 번째 open 문에 encoding 인자를 넘겨 줌으로써 메시지를 인코딩하고, 두번째 open 문에서는 이를 디코딩합니다. 이 때 encoding 인자는 텍스트 모드로 파일을 열었을 때만 사용 가능하다는 점에 유의하세요.

유니코드 리터럴 상수를 활용할 때에는 (즉, 문자열의 앞에 u를 달아주어야 할 때), 파이썬에게 이 파일이 UTF-8을 쓴다는 점을 알려 주어야 합니다. 이렇게 하려면, # encoding=utf-8 이라는 주석을 프로그램의 맨 윗줄에 달아 주면 됩니다.

다음 글들을 읽어 보시면 더 많은 것들을 배울 수 있을 것입니다:

요약

지금까지 여러가지 종류의 입/출력 및 파일을 다루는 법, 그리고 pickle 모듈을 다루는 법과 유니코드에 대해 배워 보았습니다.

다음으로는 예외 처리의 개념에 대해 배워봅시다.


1. 튜플을 사용하여 (필요한 모든 문장 부호들은 여기에 있습니다). 여기에 모든 문장 부호들 및 공백들을 담아 두고, 멤버십 테스트를 통해 각 문자가 제거되어야 하는지 여부를 판단할 때 활용하시기 바랍니다. 즉, forbidden = ('!', '?', '.', ...​) 와 같은 튜플을 만들고 활용해 보세요.

results matching ""

    No results matching ""