강의목표

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

+ Recent posts