ai-creator

[python 독학] 9. 상대경로, 절대경로 - 파일 read, write할 때 필수 본문

유치한 파이썬

[python 독학] 9. 상대경로, 절대경로 - 파일 read, write할 때 필수

ai-creator 2021. 3. 6. 07:25
반응형

유치한 파이썬에 오신 것을 환영합니다.

오늘은 [상대 경로, 절대 경로]입니다.

오늘은 아래와 같은 순서로 배워보겠습니다.

 

1. 들어가기

2. 상대 경로, 절대 경로로 파일 읽고, 쓰기

3. 요약정리


1. 들어가기

상대적이다, 절대적이다!라는 단어를 먼저 잘 생각해보세요.

주황색 동그라미의 크기가 왼쪽이 상대적으로 작아 보이죠. 근데 원래 두 주황색 동그라미의 크기가 동일합니다.

상대적으로 비교가 돼서 이런 착시효과가 나타나는 것이지요.

[그림 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

이렇게 '내가 작업하는 위치를 기준으로 경로가 결정된다'가 느껴지시나요?

 

이를 배워야 하는 이유가 뭘까요?

파일로 읽고, 쓰기를 할 때 은근히 어려워하는 점이 해당 파일이 어디에 있는지?입니다.

읽고자 하는 파일이 어디에 있는지? 쓰는 파일이 어디에 만들어진 건지?찾지 못하는 경우가 비일비재합니다.

2. 상대 경로, 절대 경로로 파일 읽고, 쓰기

먼저 여러분들도 특정 폴더에 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 생성

 

3-1) 작업하는 경로 확인하기

그럼 작업하는 경로(위치)가 어디인지 확인을 해봅니다.

 

코드

1
2
import os
print(os.getcwd())
cs

실행 결과

작업 경로가 출력되었습니다.

D:\101. work\python\res

코드 설명

1라인 : 필요한 라이브러리를 import 합니다. 현재 폴더 경로를 확인하기 위해서 os 패키지를 사용합니다.  os패키지에 있는 함수를 사용하므로, 패키지.함수명 으로 표현하면 되겠죠?

2라인 : os.getcwd() 를 호출하여 경로를 출력합니다. 

> cwd = current working directory  현재 작업 중인 디렉터리(폴더)를 의미하고, get = 얻어온다는 의미가 있으니, 현재 작업 중인 폴더를 얻어온다는 의미가 되겠습니다.

 

3-2) 절대 경로로  파일 읽기

절대 경로로 파일을 읽어보겠습니다.

코드

1
2
3
4
f = open("D:/101. work/python/res/path_test/test.txt", "r", encoding="utf-8")
data = f.read()
print(data)
f.close()
cs

실행 결과

hello
안녕하세요.

코드 설명

파일을 다룰 때는 파일을 열고 > 읽고 > 열어둔 파일을 닫는 순서로 진행됩니다. 

파이썬 내장 함수를 사용하여 파일을 다룹니다.

1라인 : 파일을 열기 위해 파이썬 내장 함수 open()을 사용합니다.  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(파일 이름, 파일 열기 모드, ...) as 파일 객체:

코드

1
2
3
with open("D:/101. work/python/res/path_test/test.txt""r", encoding="utf-8"as f:
    data = f.read()
    print(data)
cs

3-3) 상대 경로로 파일 읽기

상대 경로로 파일을 읽어보겠습니다.

파일은 아래 언급된 위치에 있고,

"D:/101. work/python/res/path_test/test.txt"

작업하고 있는 경로는 아래와 같습니다.

"D:/101. work/python/res"

그렇다면 상대경로로 파일을 연다고 하면, 어떻게 하면 될까요?

 

코드

1
2
3
with open("path_test/test.txt""r", encoding="utf-8"as f:
    data = f.read()
    print(data)
cs

실행 결과

상대경로로 파일을 접근해서 읽은 내용물입니다.

hello
안녕하세요.

코드 설명

1라인 : with ~ as문을 사용하여 파일을 열었습니다. 이때 파일 이름을 상대경로로 설정하였습니다.

2~3라인 : 파일의 내용물을 읽고, 출력합니다.

 

다음은 파일에 내용물을 작성(write)해보겠습니다.

 

3-4) 파일 쓰기

파일에 쓸 때도 읽는 방법과 동일합니다. 다만 "파일 열기 모드"만  "w"로 설정해주면 됩니다.

코드

1
2
3
4
data = "재미난 파이썬 프로그래밍"
with open("write_test.txt""w", encoding="utf-8"as f:
    f.write(data)
    print("파일 작성 완료")
cs

실행 결과

작성된 파일이 어디에 있을까요? 위에 적힌 경로는 상대 경로인가요? 절대 경로인가요? 상대 경로이지요. 그럼, 현재 작업 중인 경로에 파일이 생성됩니다.

[그림 x-9] 파일이 작성된 경로 확인 / [그림 x-10] 쓰기모드로 작성된 내용물 확인

 

코드 설명

파일에 쓸 때도 읽는 방법과 동일하게 파일을 열고 > 쓰고 > 닫고의 순서로 진행됩니다.

1라인 : 파일에 적을 내용물입니다.

2라인 : 파일 이름은 상대 경로로 작성되어 있습니다. 현재 작업 중인 폴더에 write_test.txt가 만들어질 것입니다. 파일을 "w"모드로 열었습니다. 

만약, D:\101. work\python\res\path_test 폴더에 write_test.txt를 만들려면 어떻게 해야 할까요? 2가지 방법이 있습니다.

절대 경로라면, "D:/101. work/python/res/path_test/write_test.txt"로

상대 경로라면, "path_test/write_test.txt"로 변경해주면 되겠죠?

3라인 : 내용물을 적습니다.

 

 

3. 요약정리

이번 장에서는 상대 경로와 절대 경로를 이용하여 파일을 일고, 쓰는 방법에 대해서 알아보았습니다.

상대 경로는 '상대적'이다는 의미와 동일합니다. 즉, 내가 작업하는 위치를 기준으로 경로가 결정된다는 의미입니다.

절대 경로는 (내가 작업하는 위치와는 상관없이) 절대로 변하지 않는 경로를 의미합니다.

이를 잘 이해해서, 개념에 흔들림이 없기를 바랍니다.

 

 


도움이 되셨다면, 좋아요 / 구독 버튼 눌러주세요~

 

저작물의 저작권은 작성자에게 있습니다.
공유는 자유롭게 하시되 댓글 남겨주세요~
상업적 용도로는 무단 사용을 금지합니다.
끝까지 읽어주셔서 감사합니다^^

반응형
Comments