ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Python 문법 기초 31 - file i/o (try ~ except) + pickle(import)
    Python 2022. 10. 22. 17:27

     

    # file i/o
    
    import os
    print(os.getcwd())
    
    try:
        print('읽기') # 읽기
        # f1 = open(r'C:\work\psou\pro1\pack3/file_test.txt', mode = 'r', encoding = 'utf8')
        # f1 = open(os.getcwd() +'\\file_test.txt', mode = 'r', encoding = 'utf8')
        f1 = open('file_test.txt', mode = 'r', encoding = 'utf8') # mode = 'r', 'w', 'a', 'b' ...
        print(f1.read())
        f1.close()
        
        print('저장') # 덮어쓰기
        f2 = open('file_test2.txt', mode = 'w', encoding = 'utf8')
        f2.write('My friends\n')
        f2.write('홍길동, 나길동')
        f2.close()
        
        print('추가') # 추가
        f3 = open('file_test2.txt', mode = 'a', encoding = 'utf8')
        f3.write('\n손오공')
        f3.write('\n팔계')
        f3.write('\n오정')
        f3.close()
        
        print('읽기')
        f4 = open('file_test2.txt', mode = 'r', encoding = 'utf8')
        print(f4.readline()) # 한줄씩 읽는다
        print(f4.readline())
        f4.close()
        
    except Exception as e:
        print('에러 : ', e)
    
    
    <console>
    C:\work\psou\pro1\pack3
    읽기
    가을이 깊어가고
    파이썬도 깊어가고
    DB연동
    프로그램이
    서서히 다가오고 있다
    저장
    추가
    읽기
    My friends
    
    홍길동, 나길동

    read()는 내용을 읽어주는 함수이다.

    readline() 은 한 줄씩 읽어주는 함수이다.

    close()는 open() 했으면 무조건 닫아야 된다.

    파일이 없다면 만들어진다.

     

     

    mode 종류

    파일열기모드 설명

    r 읽기모드 - 파일을 읽기만 할 때 사용
    w 쓰기모드 - 파일에 내용을 쓸 때 사용
    a 추가모드 - 파일의 마지막에 새로운 내용을 추가 시킬 때 사용
    t 텍스트 모드, 텍스트 문자 기록에 사용 (디폴트)
    b 바이너리 모드, 바이트단위 데이터 기록에
    wb 바이너리 쓰기모드
    rn 바이너리 읽기모드

     

    # file i/o + with 문
    
    try:
        # 저장
        with open('file_test3.txt', mode = 'w', encoding='utf8') as obj1:
            obj1.write('파이썬으로 문서 저장\n')
            obj1.write('with문을 쓰면\n')
            obj1.write('명시적으로 close()를 하지 않는다.')
    
        # 읽기
        with open('file_test3.txt', mode = 'r', encoding='utf8') as obj2:
            print(obj2.read())
            
    except Exception as e:
        print('오류 : ', e)
        
    print('피클링(객체 저장)')
    import pickle
    
    try:
        dictData = {'소현' : '111-1111', '승경' : '222-2222'}
        listData = ['곡물그대로리', '새우깡']
        tupleData = (listData, dictData) # 복합 객체
        
        # 객체를 저장
        with open('hello.dat', mode = 'wb') as obj3:
            pickle.dump(tupleData, obj3) # data, 파일객체
            pickle.dump(listData, obj3)
            
        # 객체를 읽기
        with open('hello.dat', mode = 'rb') as obj3:
            a, b = pickle.load(obj3)
            print(a)
            print(b)
            c = pickle.load(obj3) # 변수가 하나이므로 listData밖에 안 담긴다.
            print(c)
        
    except Exception as e2:
        print('오류 : ', e2)

    with문을 사용하면 close()를 할 필요가 없다.

    경로가 현재경로이면 open() 시 바로 이름명을 입력하면 된다.

     

     

    예제 1) 동 이름을 입력해 해당 동 관련 우편번호 및 주소 출력

    # 동 이름을 입력해 해당 동 관련 우편번호 및 주소 출력
    
    try:
        # dong = input('동 이름 입력 :')
        # print(dong)
        dong = '개포'
        
        with open('zipcode.txt', mode = 'r', encoding = 'euc-kr') as f:
            line = f.readline()
            # print(line)
            # lines = line.split('\t') 같은 의미이다.
            lines = line.split(chr(9))
            # print(lines)
            if lines[3].startswith(dong):
                # print(lines)
                print('[' + lines[0] + ']' + lines[1] + ' ' + lines[2] + ' ' + lines[3] + ' ' + lines[4])
            
    except Exception as e:
        print('err : ', e)
    
    
    <console>
    [135-806]서울 강남구 개포1동 경남아파트

    우편번호가 들어있는 txt 파일을 미리 준비해둔 상태이다.

     

    # 동 이름을 입력해 해당 동 관련 우편번호 및 주소 출력
    
    try:
        dong = input('동 이름 입력 :')
        print(dong)
        
        with open('zipcode.txt', mode = 'r', encoding = 'euc-kr') as f:
            line = f.readline()
            # print(line)
            while line:
                # lines = line.split('\t') 같은 의미이다.
                lines = line.split(chr(9))
                # print(lines)
                if lines[3].startswith(dong):
                    # print(lines)
                    print('[' + lines[0] + ']' + lines[1] + ' ' + lines[2] + ' ' + lines[3] + ' ' + lines[4])
            
                line = f.readline()
            
    except Exception as e:
        print('err : ', e)
    
    <console>
    동 이름 입력 :청담동
    청담동
    [135-766]서울 강남구 청담동 금하빌딩 
    [135-765]서울 강남구 청담동 세신빌딩 
    [135-762]서울 강남구 청담동 에버원메디컬리조트 
    [135-767]서울 강남구 청담동 오미빌딩 
    [135-763]서울 강남구 청담동 은성빌딩 
    [135-761]서울 강남구 청담동 정화빌딩 
    [135-764]서울 강남구 청담동 청담빌딩 
    [135-948]서울 강남구 청담동 1∼5
    [135-949]서울 강남구 청담동 6∼19
    [135-950]서울 강남구 청담동 20∼35
    [135-951]서울 강남구 청담동 36∼47
    [135-952]서울 강남구 청담동 48∼61
    [135-953]서울 강남구 청담동 62∼76
    [135-954]서울 강남구 청담동 78∼91
    [135-517]서울 강남구 청담동 92∼99
    [135-956]서울 강남구 청담동 100∼106
    [135-955]서울 강남구 청담동 107∼123
    [135-957]서울 강남구 청담동 124∼132
    [135-958]서울 강남구 청담동 133∼134
    [135-959]서울 강남구 청담동 135∼143
    [135-100]서울 강남구 청담동

    while 문으로 해당 동은 다 출력한다.

    조건과 while문을 빼고 read()로 하면 모든 데이터 출력 가능

     

     

    아스키 코드표(ASCII CODE)

    최소한 체크 된 곳 정도는 알아두자.

     

    댓글

Designed by Tistory.