2022. 6. 26. 12:14ㆍPython
I/O (Input / Output)
말 그대로 프로그램 입장에서
들어오는 모든 데이터를 Input,
나가는 걸 Output이라고 한다.
스토리지로부터 파일을 불러오는 것도
input이고, 프로그램 결과를 스토리지에
저장하는 것 역시 ouput이라고 한다.
이 작업을 file I/O라고 통칭한다.
그 외에 키보드로 입력받는 걸
stdin이라고 하며, 반대로 모니터로
출력하는 걸 stdout이라고 한다.
STDIN / STDOUT (Standard IN, Standard OUT)
이미 자주 사용하고 있는 input()과
print()가 여기에 해당된다.
input()이 stdin이고, print()가 stout이다.
python에서 stdin은 무조건 문자열 타입으로
들어오기 때문에 type casting을 통해 다른
데이터 타입으로 바꾸어 사용해야 한다.
나 역시 초반에 자주 실수했던 부분인데
예를 들면 아래와 같은 경우를 말한다.
a = input("숫자를 입력하세요 : ")
라고 입력하여 코드를 돌리면 값을
입력받기 위한 창이 뜬다. 거기에 5 하고
입력을 하면 output 역시 5가 뜨지만
type(a)를 입력해보면 str.이 뜬다.
print(a + 5)
>>> Type Error
…
자칫 출력값이 5인 것만 보고 연산에
활용을 하면 오류가 뜬다는 뜻이다.
때문에 숫자로 취급하여 연산을 하고
싶다면 아래와 같이 type casting을
해주어야 한다.
# (명시적)타입 변환
a = int(input("숫자를 입력하세요 : "))
이렇게 변환을 한 후 연산에 대입하면
error 없이 값이 잘 뜬다.
(+추가)
만약 stdin으로 여러 개의 숫자를 받고 싶은 경우...
, 로 구분하여 받아서 split으로 뜯어서 구분하면
되지 않을까? 물론 타입 변환도 해주어야 한다.
s = input()
a = int(s.split(',')[0])
b = int(s.split(',')[1])
print(a, b)
하지만 2개 이상 숫자를 받는데
몇 개인지 모르겠을 때는 이것만으론
부족한데, 그때 활용 가능한 것이
list comprehension이다.
List comprehension ★★★
# 1
L = []
for x in range(1, 5):
L.append(x)
# 2
L = [x for x in range(1,5)]
이와 같이 for문이 포함된 여러 줄을
사용하여 나타냈던 코드를 단 한 줄로
나타내는 방법을 말한다.
# 1
L = []
for x in range(1, 10):
if x % 2 != 0:
L.append(x)
# 2
L = [x for x in range(1,10) if x % 2 != 0]
위와 같이 if 조건문을 추가하는 것도 가능하다.
# step1 : 숫자 여러 개 입력 받고 , 기준으로 다 뜯기
L = input("콤마를 기준으로 숫자를 여러개 입력해주세요 : ").split(',')
# step2 : for문을 활용해 개수 상관없이 받을 수 있도록 하기
L = [x for x in input("콤마를 기준으로 숫자를 여러개 입력해주세요 : ").split(',')]
# step3 : int()를 씌워서 x int로 타입 변환해주기
L = [int(x) for x in input("콤마를 기준으로 숫자를 여러개 입력해주세요 : ").split(',')]
기존에 하던 # 1 방법이 직관적일 수는 있지만
익숙해지기만 한다면 list comprehension이
훨씬 편하고 코드 역시 깔끔해질 것이다.
File I/O
텍스트 파일을 여는 방법은 read(), readline(),
readlines(), for()문을 이용하는 방법이 있는데
일부는 작년에 책을 보며 공부할 때 기록했던
적이 있는 함수이기도 하다. 이번엔 4가지를
한 번에 배우고 복습하며 비교하는 기회로 가졌다.
※ data 폴더 안에 있는 test.txt를 read mode로 열어보기
① f.read() 사용
with open("data/test.txt", 'r') as f:
data = f.read()
data
/를 쓰면 data 폴더 안에, '하위'란 의미를
가진다. 이후 파일명을 알면 그대로 적으면 되나
모른다면 data/ 에서 tab키를 누르면 파일이
옆에 바로 떠서 자동완성을 시킬 수 있다.
읽을 파일을 지정하고 나서는 , 'r' 로
읽어오겠다고 명령, 뒤에 as가 따라오는데
뭘로 이걸 불러올 건지 이름을 지정해주는 것이다.
이번에는 간단하게 f라고 해봤다. 여기까지가
["data/test.txt"라는 파일을 읽어오는 걸 f로
인지하겠다.] 이다. f.read 함수는 txt파일에 있는
모든 글자를 가져와 하나의 string으로 저장한다.
② f.readline() 사용
with open("data/test.txt", 'r') as f:
data = f.readline()
data
f.readline 함수는 txt파일에 있는
첫 번째 줄만 가져온다.
③ f.readlines() 사용
with open("data/test.txt", 'r') as f:
data = f.readlines()
data
f.readlines 함수는 txt파일에 있는 모든 텍스트를
한 줄 단위로 끊어서 리스트에 저장해준다.
ㅇㅇ
④ for문 사용
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 oine in output:
print(line, file=f)
# 데이터가 잘 저장되었는지 불러와서 확인
with open("data/result.txt", 'r') as f:
for line in f:
print(line)
pickle 라이브러리를 통해서 python object 자체를 저장하기
아까 위에서 구한 output 변수 자체를
저장하고 싶을 때, 리스트 자체를 저장하고
싶을 때 사용하는 것이 pickle 라이브러리다.
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)
pickle 은 바이너리 파일로 저장되기 때문에
읽고 쓸 때도 바이너리의 b를 앞에 붙여줘야 한다.
wirte as binary, read as binary의 줄임말이라고 생각.
바이너리 파일(binary file)이란 binary에서
알 수 있든 0과 1로 이루어진 2진수 파일이다.
때문에 이 파일을 그냥 열거나 읽을 수 없고
파이썬과 같이 코드 라이브러리로만
가져오고 내보내고 할 수 있다.
'Python' 카테고리의 다른 글
[Python 독학] 예외처리, 내장함수, 라이브러리(외장함수) (0) | 2021.11.25 |
---|---|
[Python 독학] 모듈, 패키지 (0) | 2021.11.12 |
[Python 독학] 클래스 ② (0) | 2021.07.07 |
[Python 독학] 클래스 ① (0) | 2021.07.07 |
[Python 독학] 파이썬 파일 읽고 쓰기 (0) | 2021.06.29 |