상세 컨텐츠

본문 제목

9. 파일 읽고 쓰기 File I/O

Python

by evaseo 2021. 4. 25. 18:54

본문

1.    대량의 데이터를 얻을 수 있는 방법1

2.    import os로 로딩해줘야 함

3.    파일 생성

(1)     내장함수 open()을 사용하여 파일 생성

(2)     형식:
파일 객체명 = open(‘파일이름.확장자’, mode = ‘파일 열기 모드’, [encoding = ])

(3)     파일열기 모드

1)       r: 읽기모드

        파일을 읽기만 할 때 사용

        default=> 생략 시 읽기모드

2)       w: 쓰기모드

        파일에 내용을 쓸 때 사용

        기존에 있던 내용은 사라지고 새로 써진다.

        파일이 없다면 새로 생성되고 써진다.

3)       a: 추가모드 파일의 마지막에 새로운 내용을 추가할 때 사용

 

4.    사용했던 자원 해제: 파일객체명.close()

        생략가능

        쓰기모드로 열었던 파일을 닫지 않고 다시 사용하려면 오류 발생

        직접 파일은 닫아줘야 함. 열었으면 닫아 주기

 

5.    쓰기모드로 열었을 때 출력 값 적는 방법

(1)     파일객체명.write(내용) – 파일에 작성됨

(2)     print(내용) – 콘솔에만 작성됨

(3)     csv파일 쓰기: csv.writer(fw).writerow(row)

import random

def calc_bmi(h, w):
    bmi = w/(h/100)**2
    if bmi < 18.5: return 'thin'
    if bmi < 23: return 'normal'
    return 'fat'

print(calc_bmi(170, 65))


fp = open('bmi.csv', 'w')
fp.write('height,weight,label\n')
cnt = {'thin':0, 'normal':0, 'fat':0}

for i in range(50000):
    h = random.randint(150, 200)
    w = random.randint(35, 100)
    label = calc_bmi(h, w)
    cnt[label] += 1 
    fp.write('{0},{1},{2}\n'.format(h, w, label))
fp.close()
print('good') # 파일이 성공적으로 생성되면 실행되는 문장​
실행결과

 

6.    읽기모드로 열었을 때 외부에 저장된 파일을 읽는 방법

(1)     파일객체명.readline()사용

1)       첫 번째 줄을 읽는 함수

2)       모든 내용을 읽으려면 while True: 무한루프로 읽어야 함, 읽을 줄이 없으면 break

3)       더 읽을 줄이 없으면 None반환
ex) while True:
       line = f.readline()
       if not line: break
       print(line)

(2)     파일객체명.readlines()사용: 파일의 모든 줄을 읽어서 리스트로 반환

(3)     파일객체명.read()사용: 파일 내용 전체를 문자열로 반환

 

7.    추가모드로 열었을 때 파일에 새로운 내용 추가

(1)     원래 있던 내용을 유지하면서 마지막에 새로운 내용을 추가

(2)     ‘a’모드로 열고 write(내용)함수를 사용하면 된다.

# file I/O (Input/Output)

import os 
print(os.getcwd())

try:
    print('파일열기')
    # mode = 'r'(읽기모드)는  default값 - 안써줘도 됨
    f1 = open(r'ftest.txt', mode = 'r', encoding='utf-8')
    print(f1)
    print(f1.read())
    f1.close() #파일은 반드시 닫아줘야함. 사용했던 자원 해제, 열었으면 닫아주기
    
    print('파일로 저장')
    # mode = 'w'(쓰기모드)
    f2 = open(r'ftest2.txt', mode = 'w', encoding='utf-8')
    f2.write('내친구들\n')
    f2.write('홍길동, 신기해, ')
    f2.write('홍삼, 신선해')
    f2.close()
    print('저장성공')
    
    print('파일 내용 추가')
    # mode = 'a'(추가모드 - append)
    f2 = open(r'ftest2.txt', mode = 'a', encoding='utf-8')
    f2.write('\n손오공\n')
    f2.write('조조')

    f2.close()
    print('추가성공')
    
    print('파일열기')
    f3 = open(r'ftest2.txt', mode = 'r', encoding='utf-8')
    print(f3)
    print(f3.read()) #전체 행 읽기
    # print(f3.readline()) # 한 행씩 읽기 - for문 사용
    f3.close() 
except Exception as e:
    print('에러: ',e)​
실행결과

 

8.    with

(1)     with문을 벗어나는 순간 열린 파일 객체를 자동으로 close()실행한다.

(2)     형식:
with open(‘
파일이름.확장자’, mode = ‘파일 열기 모드’, [encoding = ]) as 파일객체명:

print('\n--with문 사용 - close()를 자동수행-------------')

try:
    # 저장
    with open(r'ftest3.txt', mode = 'w', encoding='utf-8') as ff1:
        ff1.write('파이썬 문서 저장\n')
        ff1.write('어쩌고 저쩌고\n')
        ff1.write('with문을 사용하니깐 close()를 하지 않음\n')
        
    #읽기
    with open(r'ftest3.txt', mode = 'r', encoding='utf-8') as ff2:
        print(ff2.read())
    
    
except Exception as e2:
    print('허걱에러: ',e2)​
실행결과

 

9.    복합 개체 처리 - pickle모듈 사용

(1)     import pickle로 로딩해야 함

1)       리스트나 클래스 같은 텍스트가 아닌 자료형을 파일로 저장하기 위해 사용하는 모듈

2)       파이썬 객체 구조를 직렬화 및 역직렬화 하는데 사용하는 모듈

3)       메모리의 객체를 디스크에 저장하거나 네트워크를 통해 전송할 수 있는 바이트 스트림(Byte Stream)으로 변환 - .bin확장자로 저장하는 것을 권장

4)       바이너리(Binary)형태로 저장되고 불러오기만 하면 되므로 속도가 빠름

5)       Boolean, Integer, Float, String, Tuple, List, Set, Dictionary유형이 객체를 pickle할 수 있다.

(2)     쓰기모드: wb

1)       open()에서 mode = ‘wb’로 입력

2)       pickle.dump(저장대상, 파일객체명)

(3)     읽기모드: wr

1)       open()에서 mode = ‘wr’로 입력

2)       pickle.load(파일객체명)

print('\n--피클링  - 복합 개체 처리(I/O)----------')
import pickle

try:
    dicData = {'tom':'111-1111', 'james':'222-2222'}
    listData = ['마우스', '키보드']
    tupleData = (dicData, listData) # 복합객체
    
    #binary방식으로 저장,  w: write
    with open('hi.dat', 'wb') as fobj:
        pickle.dump(tupleData, fobj)
        pickle.dump(listData, fobj)
    print('객체를 파일로 저장하기 성공')
    
    print('객체 읽기')
    #binary방식으로 저장,  r: read
    with open('hi.dat', 'rb') as fobj2:
        a, b = pickle.load(fobj2)
        print(a)
        print(b)
        c = pickle.load(fobj2)
        print(c)
except Exception as e3:
    print('처리오류: ',e3)​
실행결과

 

종합 예제)

# 동 이름으로 우편번호와 주소 출력

try:
    dong = input('동 이름 입력: ')
    print(dong)
    
    with open(r'zipcode.txt', mode = 'r', encoding = 'euc-kr') as f:
        #print(f.read())
        line = f.readline() 
        
        while line: #한줄 읽었는데 자료읽으면 while블럭에 문장들 실행, 또 다음문장읽고 있으면 또 문장들 실행....
            lines = line.split('\t') #탭을 기준으로 구분되어 있어서 
            #print(lines) #['135-806', '서울', '강남구', '개포1동 경남아파트', '', '1\n'] =>3번째 동이름 이용(0번부터 시작)
            if lines[3].startswith(dong): #입력된 동 이름으로 시작되는 주소만 작업에 참여
                print('['+lines[0]+']' + ' ' + lines[1]+ ' ' + \
                      lines[2]+ ' ' + lines[3]+ ' ' + lines[4])
                    # 한 줄이 너무 길면 \적고 enter하면 계속 이어짐
            line = f.readline()
except Exception as e:
    print('err: ', e)​
실행결과

 

10.        from io import StringIO

외부에서 텍스트 내용을 가져올 때 이를 파일로 만들기위해서 메모장에 붙여넣기를 하고 txt파일로 저장하거나 csv파일로 저장하는 작업을 StringIO()를 이용해서 바로 파일로 저장가능

'Python' 카테고리의 다른 글

10. 내장함수  (0) 2021.04.29
8. 사용자 입력과 출력  (0) 2021.04.29
7-2. 클래스  (0) 2021.04.25
7-1. 클래스  (0) 2021.04.25
6. 모듈(module)  (0) 2021.04.25

관련글 더보기