Python (6) - 파일 입출력
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을 사용자에게 출력할 수 있다.
a = input()
a, type(a)
안녕
('안녕', str)
- 파이썬에서는 stdin은 무조건 문자열 타입으로 들어온다. 이를 type casting을 통해서 다른 데이터 타입으로 바꾸어 사용해야 한다.
# 입력받는 값을 숫자라고 가정한 경우.
a = int(input("숫자를 입력하세요 : ")) # type casting, (명시적)타입 변환
a, type(a)
숫자를 입력하세요 : 10
(10, int)
# 입력받는 값을 숫자라고 가정했는데 문자열이 들어오면 에러가 난다. 이 경우는 type casting이 실패한 경우이다.
a + 5
15
stdin으로 복수의 입력을 받을 경우
입력 format을 알고 있다고 가정했을 때
# 이는 숫자를 2개로 가정한 경우
s = input()
a = int(s.split(',')[0])
b = int(s.split(',')[1])
print(a, b, type(a), type(b))
1,2
1 2 <class 'int'> <class 'int'>
# 이와 같은 표현을 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
[1, 3, 5, 7, 9]
L = [int(x) for x in input("콤마를 기준으로 숫자를 여러개 입력해주세요 : ").split(',')]
L
콤마를 기준으로 숫자를 여러개 입력해주세요 : 1,2,3,4,5
[1, 2, 3, 4, 5]
# 위의 코드는 아래와 같다. 위의 코드가 훨씬 간단한 것을 확인할 수 있다. 익숙해져서 list comprehension을 사용하도록 하자.
L = []
for x in input("콤마를 기준으로 숫자를 여러개 입력해주세요 : ").split(','):
x = int(x)
L.append(x)
L
콤마를 기준으로 숫자를 여러개 입력해주세요 : 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문을 이용한 방법이 있다. 코드를 통해 각 방법의 차이를 알아보자.
# f.read()를 통해 data 폴더안에 있는 test.txt를 read mode로 열기
with open("data/test.txt", 'r') as f:
data = f.read() # f.read 함수는 txt파일에 있는 모든 글자를 가져와서 하나의 String으로 저장한다.
data
'아\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예를 들자면'
# f.readline()를 통해 data 폴더안에 있는 test.txt를 read mode로 열기
with open("data/test.txt", 'r') as f:
data = f.readline() # f.readline 함수는 txt파일에 있는 첫번째 줄만 가져온다.
data
'아\n'
# f.readlines()를 통해 data 폴더안에 있는 test.txt를 read mode로 열기
with open("data/test.txt", 'r') as f:
data = f.readlines() # f.readlines 함수는 txt 파일에 있는 모든 텍스트를 한줄 단위로 끊어서 리스트에 저장
data
['아\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',
'예를 들자면']
# for문을 통해 data 폴더안에 있는 test.txt를 read mode로 열어서 출력
with open("data/test.txt", 'r') as f:
for line in f:
print(line)
아
휴
아이구
아이쿠
아이고
어
나
우리
저희
따라
의해
을
를
에
의
가
으로
로
에게
뿐이다
의거하여
근거하여
입각하여
기준으로
예하면
예를 들면
예를 들자면
# 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)
# 제대로 데이터가 저장되어 있는지, 불러와서 확인한다.
with open("data/result.txt", 'r') as f:
for line in f:
print(line)
아이구
아이쿠
아이고
우리
저희
따라
의해
으로
에게
뿐이다
의거하여
근거하여
입각하여
기준으로
예하면
예를 들면
예를 들자면
pickle 라이브러리를 통해서 파이썬 object 자체를 저장하기
output
['아이구',
'아이쿠',
'아이고',
'우리',
'저희',
'따라',
'의해',
'으로',
'에게',
'뿐이다',
'의거하여',
'근거하여',
'입각하여',
'기준으로',
'예하면',
'예를 들면',
'예를 들자면']
import pickle
with open("data/test.pk", 'wb') as f:
pickle.dump(output, f)
with open("data/test.pk", 'rb') as f:
output = pickle.load(f)
output
['아이구',
'아이쿠',
'아이고',
'우리',
'저희',
'따라',
'의해',
'으로',
'에게',
'뿐이다',
'의거하여',
'근거하여',
'입각하여',
'기준으로',
'예하면',
'예를 들면',
'예를 들자면']
Reference
- 이 포스트는 SeSAC 인공지능 SW 개발자 양성 과정 - 나예진 강사님의 강의내용을 정리한 것입니다.
댓글남기기