3 분 소요


I/O (Input / Output)

I/O란?

  • 프로그램 입장에서 들어오는 모든 데이터를 input, 나가는 모든 데이터를 output이라고 한다.

    메인 메모리 입장에서 생각하는 들어오고 나가는 모든 데이터에 대해서 I/O 처리라고 부른다. (단, CPU와의 소통은 제외)

  • 사용자로 부터 키보드로 입력받는 것을 stdin이라고 하며, 사용자에게 다시 모니터로 출력되는 것을 stdout이라고 한다.

    통상적으로는 Unix 환경(터미널 환경)에서 부르던 용어인데, 프로그래밍에 자주 등장하기 때문에 소개한다.

  • 프로그램은 메인 메모리 상에 존재하기 때문에, 스토리지로부터 파일을 불러오는 것도 input이고, 프로그램의 결과를 스토리지에 저장하는 것도 output이다. 이러한 작업을 file I/O로 통칭한다.

    스토리지와 프로그램 사이의 I/O를 file I/O라고 합니다.

  • 파이썬에서 stdin/out을 사용하는 방법과 file I/O를 사용하는 방법에 대해 간단하게 알아본다.

STDIN / STDOUT (Standard IN, Standard OUT)

  • 파이썬은 input()을 통해서 stdin을 사용자로부터 입력받을 수 있다.

  • 파이썬은 print()를 통해서 stdout을 사용자에게 출력할 수 있다.

In [1]:
a = input()
a, type(a)
Out [1]:
안녕

('안녕', str)
  • 파이썬에서는 stdin은 무조건 문자열 타입으로 들어온다. 이를 type casting을 통해서 다른 데이터 타입으로 바꾸어 사용해야 한다.
In [2]:
# 입력받는 값을 숫자라고 가정한 경우.
a = int(input("숫자를 입력하세요 : ")) # type casting, (명시적)타입 변환
a, type(a)
Out [2]:
숫자를 입력하세요 : 10

(10, int)
In [3]:
# 입력받는 값을 숫자라고 가정했는데 문자열이 들어오면 에러가 난다. 이 경우는 type casting이 실패한 경우이다.
a + 5
Out [3]:
15

stdin으로 복수의 입력을 받을 경우

입력 format을 알고 있다고 가정했을 때

In [4]:
# 이는 숫자를 2개로 가정한 경우
s = input()
a = int(s.split(',')[0])
b = int(s.split(',')[1])
print(a, b, type(a), type(b))
Out [4]:
1,2

1 2 <class 'int'> <class 'int'>
In [5]:
# 이와 같은 표현을 list comprehension이라고 한다.
# L = []
# for x in range(1, 10):
#     if x % 2 != 0:
#         L.append(x)
# L

L = [x for x in range(1, 10) if x % 2 != 0]
L
Out [5]:
[1, 3, 5, 7, 9]
In [6]:
L = [int(x) for x in input("콤마를 기준으로 숫자를 여러개 입력해주세요 : ").split(',')]
L
Out [6]:
콤마를 기준으로 숫자를 여러개 입력해주세요 : 1,2,3,4,5

[1, 2, 3, 4, 5]
In [7]:
# 위의 코드는 아래와 같다. 위의 코드가 훨씬 간단한 것을 확인할 수 있다. 익숙해져서 list comprehension을 사용하도록 하자.
L = []
for x in input("콤마를 기준으로 숫자를 여러개 입력해주세요 : ").split(','):
    x = int(x)
    L.append(x)
L
Out [7]:
콤마를 기준으로 숫자를 여러개 입력해주세요 : 1,2,3,4,5

[1, 2, 3, 4, 5]

File I/O

  • 파이썬에서는 open()을 이용해서 파일을 손쉽게 열 수 있다.

  • open()을 통해 파일을 열고 난 뒤엔, close()를 통해서 닫아줘야 한다. (close를 하지 않으면 jupyter가 계속해서 파일을 점유하고 있게 되어, 시스템 낭비가 일어난다. 자세한 얘기는 생략)

  • open() 함수는 다양한 옵션을 제공하지만 기본적으로는 txt파일을 여는 것을 기본으로 가정한다.

  • 다른 타입의 파일을 열기 위해선 다른 라이브러리들이 필요하다.

e.g. csv, excel 파일을 열기 위해 pandas, csv, openpyxl 라이브러리를 사용할 수 있다.

e.g. png, jpg 파일을 열기 위해 PIL, opencv 라이브러리를 사용할 수 있다.

e.g. pk, pkl 파일을 열기 위해 pickle 라이브러리를 사용할 수 있다.

텍스트 파일을 여는 방법에는 read(), readline(), readlines(), for문을 이용한 방법이 있다. 코드를 통해 각 방법의 차이를 알아보자.

In [8]:
# f.read()를 통해 data 폴더안에 있는 test.txt를 read mode로 열기
with open("data/test.txt", 'r') as f:
    data = f.read() # f.read 함수는 txt파일에 있는 모든 글자를 가져와서 하나의 String으로 저장한다.
data
Out [8]:
'아\n휴\n아이구\n아이쿠\n아이고\n어\n나\n우리\n저희\n따라\n의해\n을\n를\n에\n의\n가\n으로\n로\n에게\n뿐이다\n의거하여\n근거하여\n입각하여\n기준으로\n예하면\n예를 들면\n예를 들자면'
In [9]:
# f.readline()를 통해 data 폴더안에 있는 test.txt를 read mode로 열기
with open("data/test.txt", 'r') as f:
    data = f.readline() # f.readline 함수는 txt파일에 있는 첫번째 줄만 가져온다.
data
Out [9]:
'아\n'
In [10]:
# f.readlines()를 통해 data 폴더안에 있는 test.txt를 read mode로 열기
with open("data/test.txt", 'r') as f:
    data = f.readlines() # f.readlines 함수는 txt 파일에 있는 모든 텍스트를 한줄 단위로 끊어서 리스트에 저장
data
Out [10]:
['아\n',
 '휴\n',
 '아이구\n',
 '아이쿠\n',
 '아이고\n',
 '어\n',
 '나\n',
 '우리\n',
 '저희\n',
 '따라\n',
 '의해\n',
 '을\n',
 '를\n',
 '에\n',
 '의\n',
 '가\n',
 '으로\n',
 '로\n',
 '에게\n',
 '뿐이다\n',
 '의거하여\n',
 '근거하여\n',
 '입각하여\n',
 '기준으로\n',
 '예하면\n',
 '예를 들면\n',
 '예를 들자면']
In [11]:
# for문을 통해 data 폴더안에 있는 test.txt를 read mode로 열어서 출력
with open("data/test.txt", 'r') as f:
    for line in f:
        print(line)
Out [11]:
아

휴

아이구

아이쿠

아이고

어

나

우리

저희

따라

의해

을

를

에

의

가

으로

로

에게

뿐이다

의거하여

근거하여

입각하여

기준으로

예하면

예를 들면

예를 들자면

In [12]:
# test.txt를 열어서 한글자짜리를 다 지우고 다시 저장하기

output = []
# test.txt를 read mode로 열고 할 일이 끝나면 자동으로 닫는다.
with open("data/test.txt", 'r') as f:
    for line in f:
        line = line.strip()
        if len(line) > 1:
            output.append(line)
    # 한글자 이상인 텍스트만 output list에 저장한다.

# result.txt로 output list에 있는 내용을 저장하기 위해 write mode로 열었다.
with open("data/result.txt", "w") as f:
    for line in output:
        print(line, file=f)
In [13]:
# 제대로 데이터가 저장되어 있는지, 불러와서 확인한다.
with open("data/result.txt", 'r') as f:
    for line in f:
        print(line)
Out [13]:
아이구

아이쿠

아이고

우리

저희

따라

의해

으로

에게

뿐이다

의거하여

근거하여

입각하여

기준으로

예하면

예를 들면

예를 들자면


pickle 라이브러리를 통해서 파이썬 object 자체를 저장하기

In [14]:
output
Out [14]:
['아이구',
 '아이쿠',
 '아이고',
 '우리',
 '저희',
 '따라',
 '의해',
 '으로',
 '에게',
 '뿐이다',
 '의거하여',
 '근거하여',
 '입각하여',
 '기준으로',
 '예하면',
 '예를 들면',
 '예를 들자면']
In [15]:
import pickle
In [16]:
with open("data/test.pk", 'wb') as f:
    pickle.dump(output, f)
    
with open("data/test.pk", 'rb') as f:
    output = pickle.load(f)
In [17]:
output
Out [17]:
['아이구',
 '아이쿠',
 '아이고',
 '우리',
 '저희',
 '따라',
 '의해',
 '으로',
 '에게',
 '뿐이다',
 '의거하여',
 '근거하여',
 '입각하여',
 '기준으로',
 '예하면',
 '예를 들면',
 '예를 들자면']

Reference

  • 이 포스트는 SeSAC 인공지능 SW 개발자 양성 과정 - 나예진 강사님의 강의내용을 정리한 것입니다.

태그:

카테고리:

업데이트:

댓글남기기