[python 독학] 9. 상대경로, 절대경로 - 파일 read, write할 때 필수
오늘은 [상대 경로, 절대 경로]입니다.
오늘은 아래와 같은 순서로 배워보겠습니다.
상대적이다, 절대적이다!라는 단어를 먼저 잘 생각해보세요.
주황색 동그라미의 크기가 왼쪽이 상대적으로 작아 보이죠. 근데 원래 두 주황색 동그라미의 크기가 동일합니다.
상대적으로 비교가 돼서 이런 착시효과가 나타나는 것이지요.
[그림 x-1] 상대적인 크기 차이 (출처 : https://ar-ar.facebook.com/102411561353001/posts/129661175294706/)
이렇듯 상대적이라고 하면, 어떤 기준이 있고 그 기준마다 평가의 결과가 다르다는 의미이죠. 즉, ‘상황에 따라 다르게 판단될 수 있다’입니다. 반대로, 절대적이다는 "아무런 조건이나 제약이 붙지 않는", "비교하거나 상대될 만한 것이 없는"으로 변하지 않는 것을 의미합니다.
그럼 상대 경로, 절대 경로란 무엇일까요?
상대 경로는 '상대적'이다는 의미와 동일합니다. 즉, 내가 작업하는 위치를 기준으로 경로가 결정된다는 의미입니다.
절대 경로는 (내가 작업하는 위치와는 상관없이) 절대로 변하지 않는 경로를 의미합니다.
[그림 x-2] 절대 경로 예시
test.txt 파일이 있습니다. 이 파일이 어디에 위치하죠?
D:\\101. work\\python\\res\\path_test
이게 절대 경로입니다. 해당 경로를 따라가면, 항상 파일을 찾을 수 있는 거죠.
상대 경로는요? 현재 위치가 "python" 폴더에서 작업을 한다면?
res\\path_test\\test.txt
그림처럼 "python"을 기준으로 찾아 내려갑니다.
[그림 x-3] 상대경로 예시(1)
그럼, 작업하는 위치가 "res" 이라면요?
[그림 x-4] 상대경로 예시(2)
res\\path_test\\test.txt
이렇게 '내가 작업하는 위치를 기준으로 경로가 결정된다'가 느껴지시나요?
이를 배워야 하는 이유가 뭘까요?
파일로 읽고, 쓰기를 할 때 은근히 어려워하는 점이 해당 파일이 어디에 있는지?입니다.
읽고자 하는 파일이 어디에 있는지? 쓰는 파일이 어디에 만들어진 건지?찾지 못하는 경우가 비일비재합니다.
먼저 여러분들도 특정 폴더에 test.txt를 만들고, 그 파일 안에 내용을 적어놓으세요.
test.txt를 읽어서 내용물을 출력하는 프로그램을 작성해 볼 겁니다.
[그림 x-5] test.txt 파일 만들기
jupyter notebook을 실행해 놓지 않았다면, 실행을 합니다. 본 예시에서는 다음 경로에서 명령어를 수행했습니다.
[그림 x-6] jupyter notebook 실행
jupyter notebook 실행 후 path_test라는 폴더가 보입니다. new > python3을 눌러서 코딩할 notebook을 여세요.
[그림 x-7] python 코드 작성용 notebook 생성
그럼 작업하는 경로(위치)가 어디인지 확인을 해봅니다.
코드
import os
print(os.getcwd())
실행 결과
D:\\101. work\\python\\res
코드 설명
1라인 : 필요한 라이브러리를 import 합니다. 현재 폴더 경로를 확인하기 위해서 os 패키지를 사용합니다. os패키지에 있는 함수를 사용하므로, 패키지**.**함수명 으로 표현하면 되겠죠?
2라인 : os.getcwd() 를 호출하여 경로를 출력합니다.
cwd = current working directory 현재 작업 중인 디렉터리(폴더)를 의미하고, get = 얻어온다는 의미가 있으니, 현재 작업 중인 폴더를 얻어온다는 의미가 되겠습니다.
절대 경로로 파일을 읽어보겠습니다.
코드
f = open("D:/101. work/python/res/path_test/test.txt", "r", encoding="utf-8")
data = f.read()
print(data)
f.close()
실행 결과
hello
안녕하세요.
코드 설명
파일을 다룰 때는 파일을 열고 > 읽고 > 열어둔 파일을 닫는 순서로 진행됩니다.
파이썬 내장 함수를 사용하여 파일을 다룹니다.
1라인 : 파일을 열기 위해 파이썬 내장 함수 open()을 사용합니다. open 함수는 다음과 같이 입력은 "파일 이름"과 "파일 열기 모드"를 받고, 기능은 파일을 엽니다. 결과는 파일 객체를 돌려줍니다.
파일 열기 모드는 다음과 같습니다.
[그림 x-8] 파일 열기 모드 (출처 : python.org)
읽기용으로 파일을 열고 싶다면, 열기 모드를 'r'로 설정하면 됩니다.
더 자세한 사용법을 알고 싶다면, 아래 링크를 확인해주세요.
참고 URL : docs.python.org/3/library/functions.html?highlight=open#open
첫 번째 '파일 이름'에 절대 경로를 주었습니다.
두 번째 '파일 열기 모드'는 읽기 모드로 열기 위해 'r'을 주었습니다.
마지막으로 encoding="utf-8"이 있는데, 한글이 있다면 해당 값으로 설정해 주어야 글자가 깨지지 않습니다. '한글 인코딩'에 대해서는 이 책의 범위를 벗어나는 내용이므로 특별히 설명하지 않겠습니다. 궁금하신 분들은 구글에 '한국어 인코딩'을 검색해보세요.
2라인 : 1라인에서 전달한 결괏값(파일 객체)을 사용하여, 파일 내용을 읽습니다.
3라인 : 읽은 내용물을 출력합니다.
4라인 : 열어둔 파일을 닫기 위해 파일 객체를 사용하여, 파일을 닫습니다.
※ 파일을 닫는 코드를 작성을 해주는 것을 깜빡 잊어서 종종 문제가 생기는 경우가 발생합니다. 그러나 잘 잊죠. 그래서 이를 관리하기 편하게 with문을 사용합니다. 아래와 같이 with문을 사용하면 with 블록을 벗어나는 순간 열린 파일 객체 f가 자동으로 close 되어 굳이 f.close()를 작성하지 않아도 됩니다.
코드
with open("D:/101. work/python/res/path_test/test.txt", "r", encoding="utf-8") as f:
data = f.read()
print(data)