ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 04 텍스트 파일 입출력 (path, with, pickle)
    코린이 유치원/파이썬반 2022. 5. 20. 02:22

    (포스팅 매일매일 해야지)했던 나의 헛된 욕심은,

    9 A.M. - 11 P.M. 까지 꽉차있는 내 스케쥴 때문에

    물거품이 되어 버렸지만

    이제 복습 안하면 헷갈리는 구간에 왔기 때문에

    급하게 써보는 오늘 배운 텍스트 파일 입!출!력!

     

    이제 python으로 파일 읽고, 쓰고 할때 절대 쫄!쥐!마

     


    01 입출력 정의

    👉🏻 입출력을 배우기 전 경로(Path)에 대해서 짚고 넘어가자.

    우리가 파일 찾을때 어디 저장해놨지? 하면서 C 폴더부터 user 폴더까지 타고타고 들어가서 target 파일을 찾아가는 그 길이 경로다.

    경로는 두가지로 표현 될 수 있는데 절대경로상대경로이다.

     

    • 절대경로
      • Root 디렉토리(=시작 디렉토리)부터 자원(파일, 디렉토리)의 위치를 표현
      • 자원의 전체적인 경로를 표현
      • 자원(파일, 디렉토리)를 옮기지 않으면, 불변하는 위치
      • 구문
        • 윈도우즈 - C:, D:
        • 리눅스, 유닉스: /
    • 상대경로
      • 현재 디렉토리(위치)로 부터 찾아가는 경로 표현
      • 현재 디렉토리(= 시작 디렉토리)
      • 구문
        • '.' - 현재 디렉토리
        • '..' - 상위 디렉토리
        • '/' - 경로 구분자

     

    👉🏻 입출력이란?

    프로그램이 외부 파일에 데이터를 읽거나(Input) 쓰는(output) 작업을 입출력(IO)라고 한다.

    코딩 패턴

    코딩 순서는 1초 생각해보면 이해 ssap 가능.

    우리가 공책에 일기 쓰는 거랑 똑같다. 공책 펴고(열고), 일기 읽기 or 쓰고 끝났으면 공책 닫기 .THE END

     

    import os # os 모듈을 import
    cwd = os.getwd() # os 의 getwd() 메소드를 통해 currect work directory(현재경로) 얻기
    print(cwd) # 현재 위치 확인 가능 C:\Users\USER\class\01_python 기초

    파일을 열고, 쓰고, 읽고, 닫고 맛보고 씹고 즐기기(?) 위해서 os 모듈이 필요함. import를 사용해서 os 모듈 꺼내보자.

     

    02  파일 열기

    Si발점인 파일을 여는 작업부터 해보자.

    열기 위해 사용하는 함수는 so 간단. 

    open() 함수 사용할 것이다(파이썬의 직관성에 박슈👏👏)

     

    👉🏻 open 함수의 사용 방법

    더보기

    open(file, mode ='', encoding = '')

    • file: 연결할 파일 경로
    • mode: 어떤 모드로 파일을 열지 지정(모드 조합 가능)
    • encoding: 텍스트 파일의 인코딩 방식 지정
      • 텍스트 파일일 때 인코딩 지정
      • UTF-8 : Linux , Web 기반에서 주로 사용/ CP949 : Wndow (메모장 📝 같은 application은 UTF-8 방식 사용)

    👉🏻 어떤 모드가 있는지 RA보자!

    Mode 종류 Mode 문자 의미
    목적 'r' 읽기모드(기본값)
    'w' 쓰기모드. 파일이 존재할 경우 그 파일 지우고 새로쓰기
    'a' 이어쓰기. 파일이 존재할 경우 기존 내용 두고 이어쓰기
    'x' 파일이 없으면 파일 생성하고 쓰기 모드로 열림. 파일 있으면 예외 발생
    데이터종류 'b' 바이너리 모드
    't' 텍스트 모드(기본값)

     

    03  파일 쓰기

    쓰기 메소드는 writewritelines 두 가지가 있다.

    • write(출력)
      • 연결된 파일에 문자열을 출력
    • writelines(문자열을 가진 컬렉션)
      • 리스트, 튜플, 집합이 원소로 가진 문자열들을 한번에 출력
      • 원소에 문자열 이외의 타입의 값이 있을 경우 TypeError 발생

     

    👉🏻 출력코드 1

    # 1. a.txt라는 파일을 열기(연결)
    file_path = r"C:\Users\USER\class\01_python 기초/a.txt" # 해당 파일의 절대 경로
                                                            # r은 이스케이프 문자 무시 
    mode = 'wt' # 쓰기 모드로 텍스트 데이터를 open
    
    file = open(file_path, mode, encoding = 'utf-8') # 파일경로와 모드 각 값을 변수로 넣어주었음
                                                     # utf-8은 유니코드 방식 중 하나 
                                                     # 인코딩 방식이 다르면 에러가 나기 때문에 지정
     
     txt = "낄희교수님 사랑해요"
     
    # 2. 출력
    file.write(txt) # 10 (글자수)
    
    # 3. 연결 닫기
    file.close()

    ** 컴퓨터는 0,1의 이진법 언어를 쓰기 때문에 컴퓨터와 우리 사이의 통역기가 필요!

    이것을 해주는 것이 유니코드, utf-8은 유니코드의 한 방식으로 서로 인코딩 방식이 달라서 오류가 나지 않도록 인코딩 방식을 utf-8로 지정

     

    👉🏻 출력코드 2(with문 사용해서 출력하기)

    with open("b.txt", "wt") as fw:  # 쓰기모드 + text 데이터 타입 = wt
    	# 출력은 여러번에 걸쳐서 할 수 있다.
        fw.write("안녕하세요\n")
        fw.write("어린이친구여러분\n")
        fw.write("딩동댕 대학교에 오신걸 환영합니다!\n")
        fw.write(str(2022)) # text 데이터 타입만 출력 가능

    👉🏻 출력코드 3(writelines)

    txt_list = ["안녕하세요\n". "딩동대대학교입니다", str(2002)]
    with open('c.txt', 'wt')as fw:
    	fw.writelines(txt_list) # list 원소들을 한번에 출력(쓰기)

     

    04  파일 읽기

    읽기 메소드는 read(), readline(), readlines(), for문 이용한 방법까지 4가지가 있다.

    • read(): 문자열(text mode), bytes(binary mode)
      • 연결된 파일에 내용을 한번에 모두 읽어 들이다.
    • readline(): 문자열
      • 한줄만 읽는다. 
      • 읽을 라인이 없으면 None을 리턴
    • readlines: 리스트
      • 한번에 다읽은 뒤 각각의 라인을 리스트에 원소로 담아 반환
    • for문을 이용한 라인단위 읽기

    👉🏻입력코드(=읽기)

    #파일 경로
    file_path = "a.text" # 상대경로
    
    # 파일 목적: 읽기
    mode = 'rt'  # 읽기모드 + 텍스트
    file = open(file_path, mode, encoding = 'utf-8') # 경로, 모드, 인코딩방식 지정
    
    # 읽기:read()
    txt = file.read()
    
    # 닫기
    file.close()

    👉🏻 read

    file_path = 'b.txt'
    with open(file_path, 'rt')as fi:
    	ding = fi.read() # read() 사용해서 파일 전체 내용 한번에 읽기
    
    print(ding) # ding 변수에 저장한 값 출력 
    
    # 출력 결과
    안녕하세요
    어린이친구여러분
    딩동댕 대학교에 오신걸 환영합니다!
    2022

    👉🏻 readlines

    file_path = 'b.txt'
    with open(file_path, 'rt')as fi:
    	ding = fi.readline() # readline() 사용해서 한줄만 읽기
    	print(ding) # 안녕하세요

    👉🏻 readlines

    file_path = 'b.txt'
    with open(file_path, 'rt')as fi:
    	ding = fi.readlines() # readlines() 사용하면 한줄씩 리스트로 반환
    
    print(ding) # ['안녕하세요\n', '어린이친구여러분\n', '딩동댕 대학교에 오신걸 환영합니다!\n', '2022']
                # 리스트로 반환
    
    # indexing 해서 출력
    print(ding[0]) 안녕하세요
    print(ding[1]) 어린이친구여러분
    print(ding[2]) 딩동댕 대학교에 오신걸 환영합니다!
    print(ding[3]) 2022

    👉🏻 for 문

    file_path = 'b.txt'
    with open(file_path, 'rt')as fi:
    	for num, text in enumerate(fi, start = 1): # 번호와 함께 출력해주는 enumerate 사용 
        	print(f"{num}/{text}")
    
    # 출력 결과(리스트 안에 문자열마다 \n이 붙어있고, 출력하면서 자동으로 \n이 붙어서 두줄씩 띄어짐)
    1/안녕하세요
    
    2/어린이친구여러분
    
    3/딩동댕 대학교에 오신걸 환영합니다!
    
    4/2022

     

    05 바이너리 파일 입 출력

    text 파일을 제외한 나머지 파일인 binary 파일의 메소드는 write(), read() 두가지가 있다.

    텍스트 파일을 이용해서 출력, 입력  방법은 익혔으니깐 바이너리 파일은 빠르게 간다 ㄱㄱ

     

    👉🏻 입력(읽기)

    # 코드 따라하기 전에 현재 경로에 img.jpg 파일 만들어 놓고 따라하세yo! 
    try:
        fi = open('img.jpg', 'rb') # 읽기r + 바이너리b  = rb
        img = fi.read()
        print(type(img)) # 바이너리의 class type으로 bytes가 출력됨
    finally:
    	fi.close() # finally 사용해서 반.드.시 닫아주기

    👉🏻 출력(쓰기)

    # img.jpg를 다른 파일명으로 쓰기(출력)
    try:
        fo = open('img2.jpg', 'wb') # img2 파일 생성
        fo.write(img) # img 이미지를 img2파일에 출력
    finally:
    	fo.close() # finally로 반.드.시 닫아주기

    👉🏻 읽고 쓰기

    with open('img.jpg', 'rb)as fi: # 연결해주기
    	with open('img3.jpg', 'wb')as fo: #img3 파일 출력 위해서 img3 파일 연결
            img = fi.read() # img 파일 읽기
            fo.write(img) # img 파일 img3 파일에 출력
    
    fi.closed # True 닫힘
    fo.closed # True 닫힘

    ** 각자 파일을 'rb'와  'wb'로 열었기 때문에  어느 파일에  write 할지 명시하지 않아도 정확하게 출력

     

    06 with block

    파일과 입출력 작업이 다 끝나면 반드시 연결을 끊어야 한다. 저장하고 파일 닫는것은 국룰! 

    근데 만약에 우리가 또 따로 코드 써서 닫아야 한다면 우린 안 닫아서 코드 여럿 날릴 것이다. 

    매번 파일 열고 닫기 귀찮으니깐 우리에게 빛처럼 내려온 함수가 있는데 그것은 바로 with.

    with block사용하면 자동으로 닫아준다. 고마워 with 👋

     

    👉🏻 with block 사용 방법

    더보기

    with open(파일명, ..) as 변수:

    👉🏻 with block 코드

    with open('a.txt, 'rt', encoding = 'utf-8') as fi:   # with open 사용해서 파일 연결
                                                         # 파일명, 모드, 인코딩 순서는 open과 동일
    	try: 
        	r = fi.read() # read 로 입력
            print(fi.closed) # fi.closed 는 연결 여부를 반환. True - 끊김, False - 연결 상태
            print(r) # r을 출력
        except:
        	print('처리') # 파일 입력 받지 못 할 경우 '처리'출력
     
    print(fi.closed) # with block 빠져나오면서 파일 자동으로 close 되었는지 확인

    ** fi.closed는 파일이 닫혀있는지 True of False로 반환. close 되었으면 True, 아직 연결 상태일 땐 False 반환

     

     

    07 pickle

    파일은 문자열은 담고 있는 파일과 그 외의 파일인 나머지 binary 파일로 나뉜다.

    문자열 파일 or binary 인지에 따라 그 메소드가 다른데, pickle은 구별해줄 필요 없이 모든 객체를 binary 파일로 입출력할 때 사용하는 모듈 🥒

     

    • pickle 모듈로 open하면 binary 모드로 열린다.
      • 파일 확장자는 보통 pkl 혹은 pickle로 지정
      • fw = open('data.pkl', 'wb'): 객체를 pickle에 저장하기 위한 output stream 생성  *wb = w 쓰기 + b 바이너리  
      • fi = open('data.pkl', 'rb): 파일에 저장된 객체를 읽어오기 위한 input stream 생성 *rb = r 읽기 + b 바이너리
    • 저장
      • pickle.dump(저장할 객체, fw)
    import pickle # 피클 모듈 import
    data = ['낄희', 'ding', 2002] # 문자와 숫자를 포함한 리스트
    
    with open('list.pkl', 'wb') as fo:
    	pickle.dump(data, fo) # data를 fo 변수 사용해서 출력
                              # write 대신에 dump 쓰는것이 포.인.트
                              
    print(data) # ['낄희', 'ding', 2002]
    • 읽기
      • pickle.load(fi)
    with open('list.pkl', 'rb) as fi:
    	list = pickle.load(fi) # read 대신에 load 쓰는 것이 포.인.트
    
    print(list) # ['낄희', 'ding', 2002]
    print(type(list)) # <class 'list'> class 타입은 리스트

     


    졸려서 웃음기 빼고 작성해본 파일 입출력

    문자열 다음 파일 입출력이라니 

    (포스팅 순서가 so 엉망)

    이 글을 봐주는 누군가가 있다면 순서 so 미얀해yo!

유사명문 코린이 유치원