강의목표
1. 바이너리 타입 및 객체 단위 파일 입출력을 구현할 수 있다.
============================================================================
바이너리 타입(이진화 = stream 파일 입출력) :
파일을 열어서 1바이트씩 데이터를 읽어서 화면에 hex 코드로 출력하는 방법
[형식]
rb, wb로 지정
모든 데이터의 이동은 stream 텍스트도 바이트로 변환해서 이동
stream : 바이트 단위로 데이터를 주고 받는 통로, 바이트 단위로 읽고 쓰는 저장소
영숫자 + 특수문자 => 1byte => stream
unicode -> utf-8(2byte) -> utf-16(3byte)
with open("file_test01.txt", "wb") as f:
# f.write(b'ABC123') # 1byte 이내 코드값 변환 ASCII, (확장형 코드 = scan code, unicode)
str = '대한민국 우리나라'
f.write(bytes(str,'utf-8'))
with open("file_test01.txt", "rb") as f:
print(str(f.read(), "utf-8"))
# print(f.read().decode()) 도 가능
#result
'대한민국 우리나라'
seek(num), tell()
with open("test.txt", "r") as f:
str = f.read() # 전체 파일의 내용을 읽어서 리턴
print(str)
f.seek(0) # 파일 포인터의 위치를 0으로 이동
while 1:
l = f.readline() # 한줄씩 읽어서 리턴
if l:
print(f.tell()) # 현재 파일 포인터의 위치를 반환
print(l, end="")
else:
break
f.seek(0) # 파일 포인터의 위치를 0으로 이동
print(f.tell())
ls = f.readlines()
print(ls) # 전체 출력
print(ls[3][2])
print(f.tell())
f.seek(9)
print(f.read())
============================================================================
객체단위 파일 입출력 : 지속 모듈 중의 하나로 파이썬 객체를 저장하는 모듈을 말한다.
1) DBM 관련 모듈 : anydbm, dbm, gdbm, dbhash, dumbdbm 등 시스템에 따라서 관련된 모듈
2) marshal 모듈 : 파이썬의 객체를 이진 포맷으로 저장(재귀적인 dict, list 객체 불가)
.pyc 파일의 컴파일된 코드를 쓰고 읽어들이는데 사용된다.
3) shelve : dict형식으로 데이터를 접근하는 dbm 모듈 중 anydbm과 동일하지만 임의 파이썬 객체가
value로 사용할 수 있다. 내부에서 dict형 인터페이스를 위해 anydbm 모듈을 사용하고
객체 저장을 위해 cPickle 모듈을 이용한다.
pickle : 파이썬에서는 개체를 파일에 저장한다는 의미를 가진다.
객체상태를 저장 -> 이진파일로 변환 저장 -> 전달 -> 복원
[장점]
- 파이썬의 기본데이터 객체 및 사용자 클래스를 저장한다
- 서로 참조되는 객체까지의 관계도 저장한다.
- 재귀적인 관계도 처리된다
- 디버깅을 설계하고 문제가 생겼을 때 텍스트 에디터로 복구를 쉽게 할 수 있다.
[단점]
- 파일의 용량이 크다
- 처리속도가 느리다.
cPickle : Pickle의 단점을 보완한 모듈
3.5ver 이후 윈도우 cPickle이 pickle로 병합되었다.
1. import pickle or cPickle
2. dump(object, file) 를 이용해서 파일로 객체를 출력한다. 파이썬 -> 파일로
dumps(object) -> string 문자열로 객체를 출력한다. 파이썬 -> 파일로
3. load(file) -> object : 파일에서 객체를 리턴받는다. 파일 -> 파이썬 없으면 없는끼리
loads(bytes) -> object : 문자열에서 객체를 리턴한다. 파일 -> 파이썬 s는 s끼리
튜플객체 전달
import pickle
book = {'java': 30000, 'python': 35000, 'oracle': 40000, 'jsp': 20000}
l_list = ["abcd", 90, 90.8,"대한민국", "☆★","金"]
t_tuple = (book, l_list)
print(t_tuple)
with open('ptest.txt', 'wb') as f:
pickle.dump(t_tuple, f) # 파일에 객체를 저장
with open("ptest.txt", "rb") as f:
res01, res02 = pickle.load(f) # 파일에 저장된 객체를 불러오기
print(res01)
print(res02)
#result
({'java': 30000, 'python': 35000, 'oracle': 40000, 'jsp': 20000}, ['abcd', 90, 90.8, '대한민국', '☆★', '金'])
{'java': 30000, 'python': 35000, 'oracle': 40000, 'jsp': 20000}
['abcd', 90, 90.8, '대한민국', '☆★', '金']
클래스 객체 전달
import pickle
class Address:
def __init__(self, name, addr, tel):
self.name = name
self.addr = addr
self.tel = tel
def prn(self):
print(f"{self.name}, {self.addr}, {self.tel}\n")
if __name__ == '__main__':
no01 = Address("홍길동", "서울", "02-000-0000")
with open("address.txt", "wb") as f:
pickle.dump(no01, f)
with open("address.txt", "rb") as f:
res = pickle.load(f)
res.prn()
#result
홍길동, 서울, 02-000-0000
============================================================================
번외
overloding 기능을 가진 메소드 : 메소드 이름은 동일한데 괄호 안 매개인자의 개수나 타입을
다르게 지정해서 호출하도록 선언하는 방법
ex)
bytes(iterable_of_ints) -> bytes
bytes(string, encoding[, errors]) -> bytes
bytes(bytes_or_buffer) -> immutable copy of bytes_or_buffer
bytes(int) -> bytes object of size given by the parameter initialized with null bytes
bytes() -> empty bytes object
'데이터과학자 - 강의 > python' 카테고리의 다른 글
210507 python - built in function, 모듈 활용 (0) | 2021.05.07 |
---|---|
210506 python - exception, decimal (0) | 2021.05.06 |
210503 python day-11 : os, file i/o (0) | 2021.05.03 |
210429 python day-10 : 다중상속, 다형성 (0) | 2021.04.29 |
210428 python day-09 : 상속 (0) | 2021.04.28 |