파일처리
파이썬엔 파일 관련된 처리를 하는 표준 함수가 기본으로 제공된다.
기본으로 제공되어 처리할 수 있는 파일은 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" 파일이 하나 생성된다.
위 코드를 따라 쓰고 실행시켜보았다. 파일은 잘 생성되었지만, 파일 안에 아무 내용도 적혀있지 않았었다.
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만 알아보자면 CSV는 Comma 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명의 키와 몸무게를 만들었다.
데이터를 한 줄씩 읽을땐 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()함수도 혼자 쓰라고 하면 잘 못쓸 것 같은데 이 부분은 직접 코딩해서 프로그래밍 경험을 쌓아야 해결할 수 있는 문제라고 생각한다.
'자기계발 > Python' 카테고리의 다른 글
[Python] 기본16. 예외 고급 (0) | 2022.03.16 |
---|---|
[Python] 기본15. 구문 오류와 예외 (0) | 2022.03.10 |
[Python] 기본13. 함수 고급(튜플과 람다) (0) | 2022.03.08 |
[Python] 기본12. 재귀함수와 메모화 (0) | 2022.03.07 |
[Python] 기본11. 함수(가변, 기본, 키워드 매개변수) (0) | 2022.03.06 |