| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 1 | 2 | 3 | 4 | |||
| 5 | 6 | 7 | 8 | 9 | 10 | 11 |
| 12 | 13 | 14 | 15 | 16 | 17 | 18 |
| 19 | 20 | 21 | 22 | 23 | 24 | 25 |
| 26 | 27 | 28 | 29 | 30 |
Tags
- plt
- DataFrame
- 등차수열
- 조합
- maplotlib
- 자료구조
- python
- barh
- Folium
- 리스트
- Machine Learning
- 파이썬
- MacOS
- 스터디노트
- 머신러닝
- matplotlib
- Slicing
- 문제풀이
- pandas 메소드
- 기계학습
- 통계학
- 순열
- pandas filter
- pandas
- INSERT
- SQL
- numpy
- 등비수열
- 재귀함수
- tree.fit
Archives
- Today
- Total
코딩하는 타코야끼
[Python] 9-2강_입출력 본문
728x90
반응형
1. 입출력 (IO)
📍 입출력이란
- 프로그램이 사용하려는 외부 자원을 연결하여 데이터를 입력 받거나 출력하는 작업을 IO라고 한다.
- 외부 자원
- 파일, 원격지 컴퓨터, Database 등.
🌓 Stream
- 입출력 시 데이터의 흐름을 stream 이라고 한다.
🌓 InputStream
- Program이 외부로 부터 데이터를 읽어 들이는 흐름.
🌓 OutputStream
- Program이 외부로 데이터를 써주는 흐름.

📍 IO 코딩 순서
- 파일 열기(연결)
- 데이터를 파일에 쓰기 / 읽기
- 파일 닫기 (연결 끊기)

📍 파일 열기(연결)
🌓 open() 함수 사용
- 연결된 파일과 입출력 메소드를 제공하는 객체(Stream)를 리턴
🌓 구문
- open(file, mode='r', encoding=None)
- 함수 주요 매개변수
- file : 연결할 파일 경로
- mode : 열기 모드
- 모드는 목적, 데이터종류를 조합한다.
- encoding
- 텍스트 파일일 경우 인코딩 방식
- None 또는 생략하면 os 기본 encoding방식을 따른다.
- Windows: cp949/euckr

# w,a,x 는 다 쓰기 모드 // but, a 와 x 는 잘 안씀.
# 1 bit = 1 byte
# 읽기 -> r
# 쓰기 -> w, a ,x
# 대상: t(test)
📍 출력 메소드
🌓 write(출력할 Data)
- 연결된 파일에 출력할 Data 출력한다.
🌓 writelines(문자열을 가진 컬렉션)
- 리스트, 튜플, 집합이 원소로 가진 문자열들을 한번에 출력한다.
- text 출력일 경우에만 사용가능.
- 원소에 문자열 이외의 타입의 값이 있을 경우 TypeError 발생
# 1. 연결
# 2.연결할 파일의 경로: 문자열, Path객체 - 절대/상대경로
# 3. wt - w: 쓰기모드, t: text
fw = open(write_path, mode = 'wt', encoding = 'utf-8')
# 4. 출력(w모드)
fw.write('abcde\\n')
fw.write('가나다라\\n')
fw.write('12345')
# 5. 연결닫기
fw.close()
-------------------
txt = """안녕하세요.
반갑습니다.
또만나요."""
write_path2 = dir_path / 'test2.txt'
fw = open(write_path2, mode = 'wt', encoding = 'utf-8')
fw.write(txt)
fw.close
---------------------
txt_list = ["첫번째 줄\\n", "두번째 줄\\n", "세번째 줄\\n"]
write_path3 = dir_path / 'test3.txt'
# fw = open(write_path3, mode = 'wt', encoding = 'utf-8') # wt는 새로 쓰기
fw = open(write_path3, mode = 'at', encoding = 'utf-8') # at는 이어쓰기
fw.writelines(txt_list)
fw.close()
fw = open(write_path3, mode = 'at', encoding = 'utf-8')
print(type(fw))
print(fw.mode, fw.encoding, fw.name) # fw.name - 연결된 파일경로 확인.
fw.write('가나다')
print(fw.closed) # 연결 여부를 bool: 연결상태: False, 닫히면 True
fw.close()
print(fw.closed) # 연결 여부를 bool
# fw.write('abc') # fw: 끊어진(닫힌) 연결.
>>>
<class '_io.TextIOWrapper'>
at utf-8 file_data/test3.txt
False
True
📍 입력 메소드
🌓 read( )
- read() : 문자열(text mode), bytes(binary mode)
- 연결된 파일의 내용을 한번에 모두 읽어 들인다.
🌓 readline( )
- readline() : 문자열(text mode), bytes(binary mode)
- 한 줄만 읽는다.
- text 입력일 경우만 사용가능
- 읽은 라인이 없으면 빈문자열을 리턴한다.
🌓 readlines( )
- readlines() : 리스트
- 한번에 다 읽은 뒤 각각의 라인을 리스트에 원소로 담아 반환한다.
🌓 nput Stream ( )
- Input Stream (TextIOWrapper, BufferedReader)는 Iterable 타입
- for문을 이용한 라인단위 순차 조회할 수 있다.
read_path = 'file_data/test.txt'
# 모드: r - read, t - text파일, encoding: default는 os 인코딩방식(win:cp949, mac/리눅스: utf-8)
fr = open(read_path, mode = 'rt',encoding = 'utf-8')
# 1. 읽기 - read(): 한번에 전체를 다 읽는다.
r_txt = fr.read()
# 2. 연결 닫기
fr.close()
fr = open(read_path, mode = 'rt',encoding = 'utf-8')
print(fr.readline()) # 첫번째 줄 (print 로 인해 Enter 한번 더 읽기.)
print(fr.readline()) # 두번째 줄
print(fr.readline()) # 세번째 줄
print(fr.readline()) # 네번째 줄 - 없는 줄일 경우 "": 빈문자열 반환.
fr.close()
>>>
abcde
가나다라
12345
# readlines()
fr = open(read_path, mode = 'rt',encoding = 'utf-8')
txt_list = fr.readlines()
# print(txt_list)
for idx, txt in enumerate(txt_list, start = 1):
print(f'{idx}. {txt}', end= "")
fr.close()
>>>
1. abcde
2. 가나다라
3. 12345
📍 with block
- 파일과 입출력 작업이 다 끝나면 반드시 연결을 닫아야 한다. 매번 연결을 닫는 작업을 하는 것이 번거롭고 실수로 안 닫을 경우 문제가 생길 수 있다. with block은 block을 벗어나면 자동으로 연결을 닫아 준다. 그래서 연결을 닫는 코드를 생략할 수 있다.
변수 = open(대상파일, 모드)
with open (대상파일, 모드) as 변수
변수를 이용해서 입출력
with 블록 빠져나오면 -> close() 자동으로 처리
write_path = 'file_data/my_test.txt'
with open(write_path, 'wt', encoding = 'utf-8') as fw:
fw.write('A')
fw.write('B\\n')
fw.write('3\\n')
# fw.close()
print('종료-with block 밖')
print(fw.closed)
>>>
종료-with block 밖
True
with open(write_path, 'rt', encoding='utf-8') as fr:
print(fr.read())
print('종료', fr.closed)
>>>
AB
3
종료 True
🌓 구문)

4. pickle 모듈을 이용한 객체 직렬화
📍객체 직렬화(Object Serialization)
- 객체의 속성값들을 bytes로 변환해 출력하는 것을 객체 직렬화(Object Serialization) 이라고 한다.
- bytes로 출력된 데이터를 읽어 객체화 하는 것을 객체 역직렬화(Object Deserialization) 이라고 한다.
🌓 pickle
- 객체 파일 입출력을 위한 파이썬 모듈
- open() 시 binary mode로 설정한다.
- 저장시 파일 확장자는 보통 pkl 이나 pickle 로 한다.
- ex)

- 메소드
- dump(저장할 객체, fw) : 출력
- load(fr): 입력 - 읽은 객체를 반환한다.
import pickle
num = 10
# 출력 구문
with open('int_data.pk1', 'wb') as fw: #pickle 적용 -> binary 모드로 설정.
# 출력: dump(값, output stream)
pickle.dump(num,fw)
# 입력 구문
with open('int_data.pk1', 'rb') as fr:
# 입력 : Load(input stream)
num2 = pickle.load(fr)
print(type(num2))
print(num2)
>>>
<class 'int'>
10
data = {
'이름':'홍길동',
'나이':num,
'취미': ['a','b','c'],
"기혼": False,
"키":185.6
}
# 출력
with open('data.pk1','wb' ) as fw:
pickle.dump(data, fw)
# 입력
with open('data.pk1','rb' ) as fr:
new_data = pickle.load(fr)
print(type(new_data))
print(new_data)
print(type(new_data['이름']))
print(type(new_data['나이']))
print(type(new_data['취미']))
print(type(new_data['기혼']))
print(type(new_data['키']))
>>>
<class 'dict'>
{'이름': '홍길동', '나이': 10, '취미': ['a', 'b', 'c'], '기혼': False, '키': 185.6}
<class 'str'>
<class 'int'>
<class 'list'>
<class 'bool'>
<class 'float'>
5. CSV (Comma Separated Value) 파일
- 데이터들을 정형화(표)된 형태로 텍스트파일에 저장하는 방식
- 하나의 데이터는 한줄에 표시. (데이터 구분자는 엔터)
- 하나의 데이터를 구성하는 값들(속성)들은 , 로 구분
- tab으로 구분하는 경우 TSV
- 각 속성값들은 " " 로 감싸기도 한다.
- 텍스트기반
- 파일 확장자는 .csv, .tsv 로 준다.
반응형
'[T.I.L] : Today I Learned > Python' 카테고리의 다른 글
| [Python] 11강_파이썬 정규표현식 (0) | 2023.04.09 |
|---|---|
| [Python] 10강_Iterable 과 Decorator (0) | 2023.04.09 |
| [Python] 9-1강_Path (0) | 2023.04.09 |
| [Python] 8강_예외처리 (0) | 2023.04.09 |
| [Python] 7강_패키지 모듈 import (0) | 2023.04.05 |