A Byte of Python - Input and Output Python


Input and Output

사용자로부터 입력을 얻고 결과를 출력하는 상황과 같은 사용자와 상호작용해야만 하는 상황이 있다. 이는 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")
else:
  print("No")

Output:

$ python3 io_input.pyEnter text: sirNo, it is not a palindrome$ python3 io_input.pyEnter text: madamYes, it is a palindrome$ python3 io_input.pyEnter text: racecarYes, it is a palindrome

동작분석

텍스트를 리버스하는데 슬라이싱 기능을 사용한다. seq[a:b]코드를 사용하여 슬라이스를 만들 수 있음을 보았다. 세번째 매개변수를 건내 step값을 할당하며 -1을 건내 텍스트가 반대가 되게한다.

input()함수는 매개변수로 문자열을 받아 이를 사용자에게 보여준다. 사용자가 뭔가 입력하고 엔터키를 누를때까지 대기한다. 입력하고 엔터를 누르면 입력된 내용을 반환한다.

텍스트를 받고 리버스한다. 만약 원본 텍스트와 리버스한 텍스트가 같으면 텍스트는 팔린드롬이다.

홈워크 연습

텍스트가 팔림드롬인지 확인할 때 특수문자는 제거되어야 한다. 예를들어 "Rise to vote, sir."은 또한 팔린드롬인데 현재 프로그램은 올바르게 출력하지 못한다. 팔린드롬을 인식할 수있게 프로그램을 어떻게 개선하면 될까?

만약 힌트가 필요하다면 아이디어는 여기에 있다.

def reverse(t):
    return t[::-1]
def pre(t):
    l=[]
    for k in t:
        if k.islower():
            l.append(k)
        elif k.isupper():
            # l.append("{}".format(k).lower())
            l.append(k.lower())
        else:
            pass
    return l
def is_palindrome(t):
    l=pre(t)
    print("pre: {}".format(l))
    return l==reverse(l)

t=input("Enter text: ")
# print("test: {}".format(t[-5::-1]))
if is_palindrome(t):
    print("Yes")
else:
    print("No")

파일

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!
'''

f=open("poem.txt","w")
f.write(poem)
f.close()

f=open('poem.txt') # assumed 'r'
while True:
  line=f.readline()
  if len(line) ==0:
    break
  print(line,end='')
f.close()

Output:

$ python3 io_using_file.pyProgramming is funWhen the work is doneif you wanna make your work also fun:    use Python!

How It Works

Note that we can create a new file object simply by using the open method. We open (or create it if it doesn't already exist) this file by using the built-in open function and specifying the name of the file and the mode in which we want to open the file. The mode can be a read mode ('r'), write mode ('w') or append mode ('a'). We can also specify whether we are reading, writing, or appending in text mode ('t') or binary mode ('b'). There are actually many more modes available and help(open) will give you more details about them. By default, open() considers the file to be a 't'ext file and opens it in 'r'ead mode.

In our example, we first open/create the file in write text mode and use the write method of the file object to write our string variable poem to the file and then we finally close the file.

다음, 같은 파일을 읽기를 위해 연다. 읽기는 기본모드이므로 모드 값을 지정할 필요가 없다. 루프에서 readline 을 사용해 각 라인을 얻는다. 이 메소드는 뉴라인 캐릭터를 포함한 라인을 얻는다. 만약 빈 문자열이면 파일의 끝임을 의미한다.

마지막에는 파일을 close한다

We can see from our readline output that this program has indeed written to and read from our new poem.txt file.

피클

파이썬은 피클이라 불리는 표준 모듈을 제공하며 파일에 플레인 파이썬 객체를 저장하는데 사용할 수 있다. 이를 영구적인 객체 저장하기라고 불린다

io_pickle.py
import pickle
shoplistfile='shoplist.data'
shoplist=['apple','mango','carrot']
f=open(shoplistfile,'wb')
pickle.dump(shoplist,f)
f.close()

del shoplist

f=open(shoplistfile,'rb')
storedlist=pickle.load(f)
print(storedlist)
f.close()

Output:

$ python io_pickle.py['apple', 'mango', 'carrot']
How It WorksTo store an object in a file, we have to first open the file in write binary mode and then call the dump function of the pickle module. This process is called pickling.Next, we retrieve the object using the load function of the pickle module which returns the object. This process is called unpickling.
유니코드

지금까지, 문자열을 사용하고 파일로 쓰고 읽어보았지만 단순 영어 문자열만 사용했다. 영어와 비영어 문자열모두 유니코드로 표시될 수 있다. 파이썬 3는 기본적으로 문자열을 유니코드에 저장한다.
일러두기: 파이썬2를 사용한다면 비 영어를 쓰거나 읽을 때 unicode형식을 사용해야 하며 u"hello world"와 같이 u로 시작해야 한다.

>>> "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)

How It Works

We use io.open and then use the encoding argument in the first open statement to encode the message, and then again in the second open statement when decoding the message. Note that we should only use encoding in the open statement when in text mode.

Whenever we write a program that uses Unicode literals (by putting a u before the string) like we have used above, we have to make sure that Python itself is told that our program uses UTF-8, and we have to put # encoding=utf-8 comment at the top of our program.

You should learn more about this topic by reading:

"The Absolute Minimum Every Software Developer Absolutely, Positively Must Know About Unicode and Character Sets"
Python Unicode Howto
Pragmatic Unicode talk by Nat Batchelder

Summary

We have discussed various types of input/output, about file handling, about the pickle module and about Unicode.

Next, we will explore the concept of exceptions.

덧글

댓글 입력 영역