<개인공부>/[Python]

[python] 파이썬 폴더 생성 방법 os.mkdir, os.makedirs, os.getcwd

BlockDMask 2021. 7. 15. 00:30
반응형

안녕하세요. BlockDMask입니다.
오늘은 파이썬에서 폴더를 생성하는 방법에 대해서 이야기해보려 합니다.

<목차>
1. 파이썬 폴더 생성을 위한 os 모듈 사용법
2. 파이썬 폴더 생성 예제

 

1. python 디렉터리 생성 


파이썬에서 폴더를 다루기 위해서는 os 라는 모듈이 필요합니다.
os 모듈은 운영체제에서 제공되는 기능을 파이썬에서 쉽게 다룰 수 있도록 제공해주는 모듈입니다.
즉 윈도에서 파일 만들기, 맥에서 폴더 만들기 등을 쉽게 파이썬 메서드, 함수로 제공해주는 모듈인 것입니다.

파이썬에서 폴더를 만들기 위해서 os 모듈에 있는 함수를 알아야 하는데, 이번 시간에는 딱 세 가지의 함수만 소개해 드리겠습니다.

먼저 os 모듈을 가지고 오기 위해서 import os를 해주어야 합니다.

1-1) 폴더를 생성해주는 os.mkdir() 

폴더를 생성해주는 함수는 os.mkdir()입니다.

os.mkdir("경로 / 폴더이름")
os.mkdir("폴더이름")

폴더 이름만 매개변수로 넘긴다면 해당 폴더를 만들어 줍니다.
특별한 곳에 만들어 주고 싶다면 경로와 위치를 입력하고  / 폴더 이름을 입력하면 됩니다.
딱히 경로를 입력하지 않고 폴더 이름만 입력한다면 현재 위치에 폴더를 만들어줍니다.

import os

os.mkdir("kimbob")  # 폴더 생성

현재 위치에 "kimbob"이라는 폴더를 생성하라고 코드를 작성하고 프로그램을 실행시키면

이렇게 지금 경로에 알아서 "kimbob"이라는 폴더가 생성됩니다.

단, 이미 같은 경로에 같은 폴더가 존재하는 경우에 에러가 발생하게 됩니다. 에러는 예외처리를 해서 처리하곤 합니다.
또한, 입력한 경로가 없는 경우에도 에러가 발생되겠죠?

 

 

1-2) 현재 경로를 알 수 있는 os.getcwd() 

os.getcwd()

os.getcwd() 함수는 지금 작업하고 있는 파일의 있는 경로, 위치를 반환해줍니다. (파일이 속해있는 폴더까지의 경로)

import os

current_path = os.getcwd()

print("현재 위치 : " + current_path)

결과를 보면 현재 example 폴더에서 작업하고 있는 걸 알 수 있습니다.

 

 

1-3) 폴더 안에 폴더를 만들게 해주는 os.makedirs() 

os.makedirs("경로/폴더1/폴더2/폴더3")
os.makedirs("/폴더1/폴더2/폴더3")
os.makedirs(" 경로/폴더~~~", exist_ok=True)

makedirs 함수는 첫 번째 인자로 들어온 경로상에 적혀있는 폴더를 다 만들어주는 함수입니다.
"적어둔 경로에 해당 폴더가 없다? => 그럼 만들어준다."
폴더 안에 폴더안에 폴더까지 한 번에 쫘라라락 만들어주는 편리한 함수입니다.
a폴더를 만들고 그 안에 b폴더를 만들고 그 안에 c 폴더까지 만들고 싶을 경우에 해당 함수를 사용하면 됩니다.

첫 번째 인자 : 경로와 폴더 이름을 적습니다.
exist_ok 옵션 : 입력한 폴더들이 다 존재하는 경우에 오류를 발생하는가? 에 대한 옵션입니다.
  디폴트는 False 이어서 만약 입력한 모든 경로의 모든 폴더가 존재하는 경우에 FileExistError 가 발생하게 됩니다.

  exist_ok=True 로 옵션을 바꾼다면 입력한 경로의 모든 폴더가 존재하더라도 오류 없이 프로그램이 진행됩니다.

예제를 바로 한번 보면

import os

os.makedirs("a/b/c/d")

현재 위치에 a 폴더 안에 b 폴더 안에 c 폴더 안에 d 폴더를 생성하라는 작업을 수행하도록 코드를 작성하였습니다.
이 경우에 a 폴더가 있다면 a폴더 안에  b/c/d 폴더를 만들겠죠?
a폴더가 없으면 a/b/c/d 를 한 번에 다 만들고
a/b 까지 있다면 c/d 만 만들 것이고
a/b/c 까지 있다면 d 만 만들 것입니다.

하지만, a/b/c/d가 모두 이미 존재하는 폴더라면 오류를 발생하게 됩니다.

처음 프로그램을 실행하게 되면 아래와 같이 같이 폴더들이 만들어지고

상태에서 다시 프로그램을 실행시키게 되면 아래와 같이 FileExistError 가 발생하게 됩니다.
입력한 경로상에 모든 폴더가 이미 존재하기 때문에 에러가 발생한 것입니다.

 

 

2. python 디렉터리 생성 예제


2-1) 현재 위치에 폴더 생성

os.mkdir으로 현재 위치에 폴더 생성을 할 수 있습니다.

import os
folder_name1 = "MyFolder1"
os.mkdir(folder_name1)  # 따로 경로 입력하지 않고 폴더명만 입력


folder_name2 = "MyFolder2"
current_path = os.getcwd()  # 현재 경로 가지고오기
os.mkdir(current_path + "/" + folder_name2)  # 현재 경로 + 폴더명 입력

이런 식으로 os.mkdir의 인자로 폴더 이름만 입력해서 폴더를 만들거나
현재 위치 + "/" + 폴더 이름을 입력해서 폴더를 만들 수 있습니다.

os.getcwd()의 반환이 현재 경로이기 때문에 "~~~/BlockDMask/Example"로 끝나게 될 것입니다.
여기에 바로 폴더 이름을 입력해버리면 "~~~/BlockDMask/ExampleMyFolder2"가 되어서 ExampleMyFolder2라는 폴더가 만들어지게 됩니다.
반드시 / 를 붙여서 "~~~/BlockDMask/Example/MyFolder2" 이런 식으로 작성이 되도록 폴더 구분을 해주어야 합니다. 

 

 

2-2) 상대 경로에 폴더 생성

상대 경로라는 것은 현재 위치를 기준으로 경로를 잡는다는 것입니다.
즉, 현재 위치를 기준으로 다른 경로를 이동할 수 있습니다.

.. : 나오는 경로
/ : 들어가는 경로

현재 위치가 /Users/dev/BlockDMask/Example이라면
이 위치를 기준으로 "../" 은 /Users/dev/BlockDMask/입니다. 한 단계 경로를 나온 것 이죠.

현재 위치  /Users/dev/BlockDMask/Example 에서 한 단계밖에 Example2라는 폴더를 만들게 되면
"../Example2" 이런 식으로 mkdir에 상대 경로 + 폴더 이름을 보내게 되면
BlockDMask 폴더 안에 Example2라는 폴더가 생기게 됩니다.

import os

print(os.getcwd())  # 현재 위치 확인용

os.mkdir("../ThisIsNewFolder1")  # 한번 위로
os.mkdir("../../ThisIsNewFolder2")  # 두번 위로

현재 위치는 첫 번째 캡처를 보셨듯이/Users/dev/BlockDMask/Example입니다.

os.mkdir("../ThisIsNewFolder1")은 현재 위치에서 하나 위로 올라간 /Users/dev/BlockDMask 위치에서 ThisIsNewFolder1 폴더를 생성하라는 명령입니다. 두 번째 캡처를 보면 BlockDMask 폴더 안에 ThisIsNewFolder1 폴더가 생긴 걸 볼 수 있습니다.

os.mkdir("../../ThisIsNewFolder2")는 현재 위치에서 두 폴더 위로 올라간 /User/dev 위치에서 ThisisNewFolder2 폴더를 생성하라는 명령입니다. 세 번째 캡처를 보면 dev 폴더 안에 ThisIsNewFolder2 폴더가 생성된 걸 볼 수 있습니다.

 

 

2-3) 절대 경로에 폴더 생성

절대 경로는 경로를 명확하게 지정해주는 것을 말합니다.

"Users/Dev/BlockDMask/Example/Abc" 이런 식으로 경로를 지정해주는 것을 말합니다.

import os

# 1 ~ 3 까지
os.mkdir("/Users/dev/BlockDMask/Example/GoodFolder1")
os.mkdir("/Users/dev/BlockDMask/Example/GoodFolder2")
os.mkdir("/Users/dev/BlockDMask/Example/GoodFolder3")


my_path = "/Users/dev/BlockDMask/Example"
folder_name = "/GoodFolder" # 맨 앞에 / 존재
num = 4
while num < 10:  # 4 ~ 9 까지
    os.mkdir(my_path + folder_name + str(num))
    num += 1

이런식으로 경로를 딱 지정해서 폴더를 만들 수 있습니다. 

 

 

2-4) 폴더 안에 폴더 생성 (여러 폴더 한 번에 생성)

import os

print(os.getcwd())  # 현재 경로 확인

os.makedirs("aaa/bbb/ccc/ddd")  # 현재 위치에서 폴더 생성

os.makedirs("../Example2/aaa/bbb/ccc")  # 하나 위에서 폴더 생성 (상대 위치)

os.makedirs("/Users/dev/BlockDMask/Example3/aaa/bbb/ccc")  # 절대위치

os.makedirs("/Users/dev/BlockDMask/Example3/aaa/bbb/ccc/ddd")  # 절대위치
os.makedirs("/Users/dev/BlockDMask/Example3/aaa/bbb/ccc/ddd", exist_ok=True)  # 같은 폴더가 있어도 무시

현재 위치는 /User/dev/BlockDMask/Example입니다.

 

os.makedirs("aaa/bbb/ccc/ddd") 명령으로 인해서 현재 위치(/User/dev/BlockDMask/Example)에서 4개의 폴더가 모두 생성되는 것을 볼 수 있습니다.

 

os.makedirs("../Example2/aaa/bbb/ccc") 명령으로 인해서 현재 위치보다 한 단계 위인 (/User/dev/BlockDMask)에서 Example2가 생성되고 그 아래 aaa, bbb, ccc 도 차례대로 생성이 됩니다.

 

os.makedirs("/User/dev/BlockDMask/Example3/aaa/bbb/ccc") 이 절대 경로에도 Example3 폴더부터 존재하지 않기 때문에 Example3, aaa, bbb, ccc 이렇게 4개의 폴더가 생성됩니다.

os.makedirs("/User/dev/BlockDMask/Example3/aaa/bbb/ccc/ddd") 명령은 ccc까지의 폴더가 존재하기 때문에 ddd 폴더만 생성하게 됩니다.

os.makedirs("/User/dev/BlockDMask/Example3/aaa/bbb/ccc/ddd", exist_ok=True) 모든 폴더가 존재하기 때문에 따로 생성하는 것이 없습니다. exist_ok 옵션이 True 이기 때문에 오류 없이 프로그램이 실행됩니다.
만약에 exist_ok=False 이게 되면 오류가 발생하게 됩니다.

이상으로 os.mkdir을 통해서 파이썬에서 폴더를 생성하는 방법과 os.makedirs, os.getcwd 함수까지 알아보았습니다.
감사합니다.

반응형