자기계발/Python

[Python] 기본14. 파일 처리 open(),close(),with 키워드

호등 2022. 3. 9. 13:27
반응형

파일처리

파이썬엔 파일 관련된 처리를 하는 표준 함수가 기본으로 제공된다.
기본으로 제공되어 처리할 수 있는 파일은 2종류(텍스트 파일, 바이너리 파일)인데
텍스트 파일에 관련된 내용을 정리할 예정이다.

파일 열고 닫기

* open( ) 함수

파일 객체 = open(문자열: 파일 경로, 문자열: 읽기 모드)

모드 설명
w write 모드(새로 쓰기 모드)
a append 모드(이어서 쓰기 모드)
r read 모드(읽기 모드)

* close( )함수

파일 객체.close( )

file = open("basic.txt", "w")
file.write("Hello, Python Programming!")

file.close()

위 코드는 txt파일을 열고 간단한 글을 작성하는 예제이다.
이 코드를 실행하면 내가 쓰고 있는 프로그램과 같은 폴더에 "basic.txt" 파일이 하나 생성된다.

폴더에 basic 메모 파일이 하나 생긴 것을 볼 수 있다.

위 코드를 따라 쓰고 실행시켜보았다. 파일은 잘 생성되었지만, 파일 안에 아무 내용도 적혀있지 않았었다.
close함수를 작성할때 괄호를 누락시켜서 close가 제대로 되지 않았던 것이 원인이었다.

open( )함수로 파일을 열었다면 꼭 close( )함수로 파일을 닫아주어야 한다.
프로그램이 종료될 때 열려있는 파일을 모두 자동으로 닫고 저장한다고 하는데 그래도 open( )으로 열었다면 close( )로 닫는 습관을 길러주는 것이 중요하다!

* with 키워드

close( )로 파일을 닫지 않는 실수를 방지하기 위한 기능이 있다.
그건 바로 with 키워드

with open(문자열: 파일 경로, 문자열: 모드) as 파일 객체:
□□□□ 문장

with open("basic.txt", "w") as file:
    file.write("Hello, with keyword!")

위에 open( ), close( )를 활용한 코드를 with 키워드로 바꿔보면 이렇게 작성이 가능하다.
with 구문이 종료될 때 파일이 자동으로 닫히기 때문에 실수를 줄일 수 있다.

* 텍스트 읽기

파일을 읽을 땐 read( )함수를 사용한다.

파일 객체.read( )

with open("basic.txt", "r") as file:
    contents = file.read()
print(contents) #출력결과 : Hello, with keyword!

파일을 열고 파일 객체의 read( ) 함수를 호출하면 내부에 있는 데이터를 모두 출력한다.
위 코드를 실행시켰더니 위에서 작성했던 파일 내용이 출력되었다.

* 텍스트 한 줄씩 읽기

텍스트를 사용하여 데이터를 구조적으로 표현할 수 있는 방법에는 CSV, XML, JSON 등이 있다.
다 많이 들어본 약자인데 여태껏 약자를 풀어서 볼 생각은 한 번도 안해본 나 반성하자

이 중 CSV만 알아보자면 CSVComma Separateed Values의 줄임말로 쉼표로 구분된 값을을 의미한다.
영어로 풀어서 보니까 굉장히 직관적이다.

첫 번째 줄에는 헤어(header)를 넣어 각 데이터가 어떤 것을 나타내는지 설명해줄 수 있다.

이름, 나이, 사는곳, 휴대폰번호
무지, 7, 인천, 01012345678
네오, 10, 부산, 01087654321
프로도, 9, 서울, 01055558888

위의 데이터는 CSV의 예시이다.

데이터를 처리할 때 한 번에 모두 읽어서 보기보단 한 번에 한 번씩 처리하는 경우가 많다.

import random

hanguls = list("가나다라마바사아자차카타파하")
#파일 쓰기 모드로 open
with open("info.txt", "w") as file:
    for i in range(1000):
        #랜덤으로 가~하부터 2글자를 골라 변수 생성
        name = random.choice(hanguls) + random.choice(hanguls)
        weight = random.randrange(40, 100)
        height = random.randrange(140,200)
        
        #텍스트 쓰기
        file.write("{}, {}, {}\n".format(name, weight, height))
랜덤하게 생성된 데이터 1,000줄

데이터를 한 줄씩 읽어서 처리하기 위해 랜덤하게 1,000명의 키와 몸무게를 만들었다.
데이터를 한 줄씩 읽을땐 for 구문을 사용하면 된다.

for 한 줄을 나타내는 문자열 in 파일 객체:
□□□□ 처리

이제 랜덤 키, 몸무게 데이터를 사용하여 BMI(비만도)를 계산할 수 있다.

with open("info.txt", "r") as file:
    for line in file:
    	#변수 선언
        (name, weight, height) = line.strip().split(", ")
        
        #예외적인 상황 확인
        if (not name) or (not weight) or (not height):
            continue
        
        #결과 계산
        bmi = int(weight) / ((int(height)/100) **2)
        result = ""
        if 25 <= bmi:
            result = "과체중"
        elif 18.5 <= bmi:
            result = "정상체중"
        else:
            result = "저체중"
           
        #출력
        print('\n'.join([
            "이름: {}",
            "몸무게: {}",
            "키: {}",
            "BMI: {}",
            "결과: {}"
            ]).format(name, weight, height, bmi, result))
        
        print()
프로그램의 실행 결과

갑자기 코드가 확 길어졌지만 처음 보는 코드는 strip()함수랑 split() 함수뿐이다.
찾아보니까 strip()함수는 문자열의 시작과 끝에서 지정한 문자를 제거하는 함수이며 디폴트 값은 공백이다.
split() 함수는 찾아보진 않았는데 뜻 그대로 구분해주는 함수인듯 하다.

공백이 없는것 같은데 strip()함수를 왜 사용한건지 잘 모르겠고 join()함수도 혼자 쓰라고 하면 잘 못쓸 것 같은데 이 부분은 직접 코딩해서 프로그래밍 경험을 쌓아야 해결할 수 있는 문제라고 생각한다.

반응형