코딩하는 타코야끼

[Python] 9-2강_입출력 본문

[T.I.L] : Today I Learned/Python

[Python] 9-2강_입출력

가스오부시 2023. 4. 9. 03:06
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