TIL - Python - 파일 읽고 쓰기

김영훈·2021년 3월 3일
0

Python

목록 보기
9/14

# 문자열 읽고 쓰기

  • 파이썬으로 파일에서 문자열을 읽거나 쓰는 기본 방식은 다음과 같다.
    with open(파일이름, 파일모드) as 파일객체:
        코드
  • 파일 이름

    • 문자열이 입력될 파일명을 적어주면 된다.

    • 만약, 파일이 특정 경로에 저장돼 있다면, /기호를 사용하여 경로를 함께 지정한다.

    • 만약 해당 파일이 존재하지 않는 경우, 입력한 파일명으로 새로운 파일이 생성된다.

  • 파일 모드

    • 'w': 파일에 문자열을 쓸 때 입력한다
    • 'r': 파일의 문자열을 읽을 때 입력한다.
  • 파일 객체

    • 문자열을 읽거나 쓰기 위해 open()로 열어둔 파일 객체를 할당할 변수를 입력한다. 변수명은 원하는 대로 지정할 수 있다.
  • 코드

    • 열어둔 파일 객체를 읽거나 쓰는 등의 구체적인 동작을 지정한다. 대표적으로, 문자열을 쓸 때 사용하는 write()와 읽을 때 사용하는 read()가 있다.
  • 예시

        # 파일 쓰기(생성)
        with open('./fcfargo.txt','w') as f:         # 문자열을 쓰게 될 파일 객체를 f라는 변수에 할당했다.
            f.write('Hello, my name is fcfargo~!')   # 할당된 객체에 write()를 추가하여 문자열을 입력했다.

       # 파일 읽기
        with open('./fcfargo.txt', 'r') as f:
            s = f.read()                            # read()로 파일의 문자열을 읽은 내용을 변수 s에 할당
            print(s)                                # 결괏값: Hello, my name is fcfargo~!

# 문자열 여러 줄로 쓰기

  • 문자열 여러 줄로 쓰기

    • for문으로 write()반복하여 여러 줄에 문자열을 쓸 수 있다.

    • 이 때 문자열을 개행시켜주는 이스케이프 문자 \n을 활용하는 것이 포인트!

  • 리스트에 들어있는 문자열을 여러 줄로 쓰기

    • writelines(문자열 리스트 객체)
  • 예시

        # 문자열 여러 줄로 쓰기
        with open('./fcfargo.txt','w') as f:
            for i in range(3):
                f.write('Hello, my name is fcfargo~!\n')   #  이스케이프 문자 '\n'를 입력해야 개행이 이뤄진다.
`                

        # 리스트에 들어있는 문자열 여러 줄로 쓰기
        str_lst1 = ['Shoes on, get up in the morn\n', "Cup of milk, let's rock and roll"] 

        with open('./fcfargo.txt', 'w') as f:
            f.writelines(str_lst1)

# 문자열 여러 줄을 읽기

  • 파일의 내용을 한 줄씩 리스트로 가져오기

    • readlines() 활용

      • readlines(): Escape 문자포함하여 파일의 문자열을 읽은 뒤, list 객체로 반환
  • 파일의 내용을 한 줄씩 읽기

    • readline() 활용

      • readline(): 파일의 문자열을 한 줄만 읽은 뒤, 문자열로 반환
    • while문을 활용하여 더 이상 읽을 문자열이 없을 때까지 읽기를 반복

    • readline()으로 문자열 한 줄을 읽은 뒤, 다음 줄의 문자열을 읽으려면, 커서(Cursor) 위치를 다음 줄로 변경해줘야 한다.

  • 예시

        # 파일의 내용을 한 줄씩 리스트로 가져오기
        
        with open('./fcfargo.txt', 'r') as f:
            lines = f.readlines()
            
            # 변수 lines에 저장된 값: ['Shoes\n', 'milk\n', 'King Kong\n', 'Sing song \n', 'LeBron']
            
            for v in lines:
                print(v.strip('\n'))     # strip()로 리스트의 요소값에서 문자열 '\n'을 삭제한 뒤 출력
          
`                
        # 파일의 내용을 한 줄씩 읽기(while)

       with open('./fcfargo.txt', 'r') as f:    
           line = f.readline()
           while line:                    # line 변수에 할당된 문자열이 존재할 경우 while문 반복
               print(line.strip('\n'))
               line = f.readline()        
               
                                          # line 변수에 다음 줄의 문자열을 새롭게 할당
                                          # 만약 다음 줄 문자열을 할당하지 않을 경우, 
                                          # while문은 같은 줄의 문자열 출력을 무한 반복하게 된다!
     
     
       # 파일의 내용을 한 줄씩 읽기(for) 
       
       with open('./fcfargo.txt', 'r') as f:
           for v in f:
               print(v.strip('n'))       # while문 대신 for문을 활용하여 더욱더 간단하게 문자열을 읽을 수 있다.

# CSV 파일 읽기

  • CSV 파일이란?

    CSV 파일 형식은 엑셀(EXCEL)과 같은 스프레드시트나 액세스(ACCESS)와 같은 데이터베이스 프로그램의 데이터 파일을 텍스트 형식으로 저장하기 위해 사용됩니다. 콤마(,)로 데이터와 데이터를 구분하여 텍스트 형식으로 저장합니다.

    • CSV 파일의 가장 큰 특징은 데이터가 저장될 때, 모든 서식이 제거된 채 오로지 콤마(,)와 텍스트로만 구성된다는 점이다. 그 때문에 많은 용량을 차지할 필요 없이 필요한 데이터만 기록으로 남길 수 있다는 장점을 갖고 있다.
  • CSV 파일을 읽는 기본 방식은 다음과 같다

    import csv
    
    with open(csv 파일, 'r') as 파일객체:
        변수 = csv.함수(파일객체)
  • import csv

    • csv 파일을 읽거나 쓰기 위해 필요한 모듈로 import가 필요하다.
  • csv.함수(파일객체)

    • csv 파일을 읽는 메서드로, 대표적으로 csv.reader(), csv.DictReader()가 있다.

    • csv.reader()

      • csv 파일의 내용을 iterable 객체로 담아 반환

      • iterable 객체의 요소는 리스트 형태로 이뤄짐

    • csv.DictReader()

      • csv 파일의 내용을 iterable 객체로 담아 반환

      • iterable 객체의 요소는 딕셔너리 형태로 이뤄짐

      • key = column,

      • value = row의 내용

  • 예시

    import csv
    
    # csv.reader()
    with open('./resources/sample1.csv', 'r') as f:
        s = csv.reader(f)                             # 변수 s는 반복 출력이 가능한 iterable 객체이다.
        next(s)                                       # next()는 iterator의 요소를 하나씩 순서대로 꺼낸다.
        s_lst = list(s)                               # 중첩 리스트 형태로 출력했다.
        print(s_lst)
       
       
    # csv.DictReader()
    with open('./resources/sample1.csv', 'r') as f:
        s = csv.DictReader(f)                         # next()를 사용하여 column 부분을 제외할 필요X
        s_dct = list(s)                               # 리스트 안의 딕셔너리 형태로 출력했다.
        for i in range(len(s_dct)):
            for k, v in s_dct[i].items():
                print(k, v)
        
    # delimiter 사용하기   
        
    with open('./resources/sample2.csv', 'r') as f:
        s = csv.reader(f, delimiter='|')              # delimiter 속성을 지정함으로써, 파일 내용 안에 있는 문자열 '|'를 기준으로 요소를 구분하여 리스트 객체로 반환된다  
        print(list(s))

# CSV 파일 쓰기

  • CSV 파일을 쓰는 기본 방식은 다음과 같다
    import csv
    
    with open(csv 파일, 'w', newline='') as 파일객체:
        변수 = csv.writer(파일객체)
        변수.writerow(쓸 문자열 or 리스트 객체 or 튜플 객체)
  • csv.writer(파일객체).writerow()

    • csv 파일에 문자열을 쓰는 메서드

    • 데이터를 row 단위로 입력(줄 바꿈을 두 번에서 한 번으로 줄이고 싶다면 속성 newline=’’추가)

    • 메서드를 두 번 사용하면, 2개의 row에 문자열이 각각 입력된다.

    • writerow(문자열) 형식으로 csv 파일에 문자열을 쓰게 되면 난감한 문제가 발생할 수 있다. 문자열이 writerow()에 의해 iterable객체로 인식되면서 문자열이 콤마로 구분되어 csv에 입력된다. 이를 방지하려면, 문자열 객체를 리스트의 요소로 담아 writerow([문자열]) 형태로 처리해야 한다.

  • 예시

    import csv
    
    lst_1 = [tuple([x+i for x in range(3)]) for i in range(5)]    #  중첩 리스트 생성

    with open('./resources/sample6.csv', 'w', newline='') as f:
        w = csv.writer(f)
        for v in lst_1:
            w.writerow(v)                                         # newline속성을 설정함으로써, 줄 바꿈이 두 번에서 한 번으로 줄었다. 
            

    a = ['Shoes', 'milk', 'King Kong', 'Sing song', 'LeBron']

    with open('./fcfargo.csv', 'w', newline='') as f:

    wc = csv.writer(f)
        for v in a:
            x = []                # 새로운 리스트 객체 x를 생성
            x.append(v)           # x에 a의 str요소값 v를  추가
            wc.writerow(x)        # 생성된 리스트 객체 a를 csv파일 row에 쓰기
            

# 파이썬 객체 파일로 쓰고 읽기

  • 지금까지 txt파일과 csv파일에 문자열을 읽고 쓰는 방법에 대해 알아봤다. 하지만 여기서 또다시 의문점. 읽고 쓸 수 있는 대상이 문자열뿐일까? 그렇지 않다. 파이썬의 객체를 파일로 읽고 쓰는 것도 가능하다. 방법은 pickle 모듈의 힘을 빌리는 것이다.

  • 예시를 통해 알아보자. 특정 데이터가 할당된 몇 가지 객체(값)를 파일에 저장해보겠다.

  • pickle 모듈을 사용하면, 파일 모드는 'w' 대신 'wb'로 지정해야 한다. 자세한 내용은 아래의 인용문을 참고하자.

    b는 바이너리(binary)를 뜻하는데, 바이너리 파일은 컴퓨터가 처리하는 파일 형식입니다. 따라서 메모장 같은 텍스트 편집기로 열어도 사람이 알아보기 어렵습니다.

  • 예시

    import pickle
    
    # 파이썬 객체 생성
    name = 'fcfargo'
    age = 32
    address = '서울시 강서구 등촌동'
    status = {'strength': 70, 'intellect': 80, 'agility': 70, 'stamina': 60}
 
    # 파이썬 객체 파일에 쓰기
    with open('./resources/fcfargo.p', 'wb') as f:
        pickle.dump(name,f)             # pickle.dump(파일에 쓸 객체, 파일 객체) 지정
        pickle.dump(age, f)
        pickle.dump(address, f)
        pickle.dump(status, f)

    # 파이썬 객체 읽기
    with open('./resources/fcfargo.p', 'rb') as f:
        name = pickle.load(f)           # 파일에서 읽을 값이 할당된 변수 = pickle.load(파일 객체) 형식으로 파일을 읽는다.                                 
        age = pickle.load(f)            # 이 경우, 파일에 저장했던 순서(name-age-address-status)대로 가져와야 한다.
        address = pickle.load(f)
        status = pickle.load(f)

    print(name)                         # 결괏값: 변수에 할당됐던 파이썬 객체가 출력된다.
    print(age)
    print(address)
    print(status)

# 개인적인 생각 정리

  • open()로 불러온 파일 객체iterable 객체다. for문으로 반복 출력이 가능하며, unpacking을 활용하여 변수에 할당하는 것도 가능하다.

  • readline()는 iterable한 파일 객체의 요소순서대로 읽고 반환한다. 만약, 파일 객체의 세 번째 요소를 읽은 뒤 반환하고 싶다면, readline()를 세 번 사용해야 한다.

  • readline()의 기능은 iterator의 요소를 차례로 하나씩 읽는 next()와 비슷한 것 같다. readline()가 iterable한 파일 객체의 문자열을 행(row)단위로 순서대로 읽어주는 것처럼, next() 역시 iterator의 요소를 순서대로 하나씩 꺼낸다.

  • strip()의 활용도가 생각보다 높다는 것을 깨달았다.

  • csv.reader()의 속성 delimitersplit()와 기능적으로 유사하다. split()가 문자열을 특정 기준(띄어쓰기, 콤마...)으로 나눠서 리스트로 반환하는 것처럼, delimiter역시 특정 기준(띄어쓰기, 콤마, '|'...)으로 파일 내용을 나눠 읽은 뒤 리스트로 반환한다.

  • csv모듈의 장점은 csv파일의 텍스트 데이터를 리스트 or 딕셔너리 객체 형태로 반환함으로써, 파일의 데이터손쉽게 접근할 수 있다는 점이 아닐까???

  • 거꾸로 리스트 객체로 이뤄진 데이터열(row)을 구분하여 손쉽게 csv파일에 입력 가능하다.

profile
Difference & Repetition

0개의 댓글