본문 바로가기
Python/Tip & Etc

파이썬(python) 폴더 만들기(없는 디렉토리 만들기)

by To올라운더 2023. 10. 27.
반응형

1. 폴더(디렉토리)를 먼저 만들어야 하는 이유

특정 파일을 생성하거나 복사를 진행할 때 꼭 필요한 요소가 폴더(디렉토리)이다.

 

그런데, 파이썬에서는 해당 경로를 먼저 만들지 않고 해당 경로에 파일을 생성하려하면,

"FileNotFoundError: [WinError 3] 지정된 경로를 찾을 수 없습니다:" 라는 메세지와 함께

Error가 발생한다.

당연히 폴더(디렉토리)를 만들고 난 뒤 파일을 생성하거나 복사를 진행하면 되는데,

어떻게 파이썬 코드를 이용해 폴더를 확인하고 생성하는지를 알아보는 시간을 가져보겠다.

 

2. 상황 구성하기

  - 테스트를 위해 아래와 같이 폴더들을 구성해보면

   D:\abc 라는 폴더 안에 각각의 폴더가 생성되어 있다.

   abc 폴더 안에는 a,b,c,d 폴더가 있고,

   a폴더 안에는 a2 폴더가, c폴더 안에는 c2, c3 폴더가 있는 형태이다.

 

3. 폴더 만들기

1) os.path.exists(dir)

 : 폴더 유무 확인하기

  - os.path.exists() 매서드를 통해 실제 폴더가 있는지 확인할 수 있다.

import os

path1 = r'D:\abc\a'
path2 = r'D:\abc\c\c2'
path3 = r'D:\abc\e'


if os.path.exists(path1):
    print(f'path1 폴더는 존재합니다.')
else:
    print(f'path1 폴더는 없는 폴더입니다')


if os.path.exists(path2):
    print(f'path2 폴더는 존재합니다.')
else:
    print(f'path2 폴더는 없는 폴더입니다')


if os.path.exists(path3):
    print(f'path3 폴더는 존재합니다.')
else:
    print(f'path3 폴더는 없는 폴더입니다')

  - 결과 값을 확인해보면, path1, path2는 있지만 path3(D:\abc\e)폴더는 없다는 결과 값을 확인할 수 있다.

 

 

2) os.mkdir(dir)

  - 폴더를 만들기 전 해당 폴더가 있는지 확인하는 선행 작업으로 확인하는데

    위에서 확인한 exists의 값을 이용한다.

  - 위의 코드와의 차이점은 os.path.exists를 사용할 때 not을 이용하여

    해당 폴더가 없으면 폴더를 생성하고 해당 폴더가 있으면 아무런 동작도 하지 않는 방식이다.

    (else 내용을 제거하여 코드를 더 간단히..)

  - 결과를 보면 정상적으로 폴더가 생성되었음을 볼 수 있다.

import os

path1 = r'D:\abc\a'
path2 = r'D:\abc\c\c2'
path3 = r'D:\abc\e'


if not os.path.exists(path1):
    print('path1의 경로를 생성합니다.')
    os.mkdir(path1)    


if not os.path.exists(path2):
    print('path2의 경로를 생성합니다.')
    os.mkdir(path2)    


if not os.path.exists(path3):
    print('path3의 경로를 생성합니다.')
    os.mkdir(path3)

 

  - 그런데, mkdir은 한가지 문제점이 있다. 순차적인 생성만 가능할 뿐, 사용자가 정의한 폴더 경로 중, 없는 폴더를 임의로 생성해주지는 않는다는 것이다.

  - 예를 들어 아래처럼 a폴더 안에 a3 폴더를 생성하고, b폴더 안에 b2, b2 폴더 안에 b3을 생성하려 하면 아래처럼 에러가 발생한다.

import os

path1 = r'D:\abc\a\a3'
path2 = r'D:\abc\b\b2\b3'


if not os.path.exists(path1):
    print('path1의 경로를 생성합니다.')
    os.mkdir(path1)    


if not os.path.exists(path2):
    print('path2의 경로를 생성합니다.')
    os.mkdir(path2)
반응형

 

 - 사실 원인은 위에 말한 내용과 같다. a3이 만들어질 상위 폴더인 a폴더는 존재하는 상태이고,

   b3가 만들어질 상위 폴더인 b2폴더는 폴더가 없기 때문이다. 

 - 그럼 어떻게 처리해야할까? 가장 쉬운 방법은 아래의 makedirs를 사용하는 방법이다.

 

 

3) os.makedirs(dir)

  - 이제 아까와 동일하게 D:>abc>b>b2>b3 폴더를 만들어보겠다.

  - b폴더는 존재하지만 b2와 b3폴더는 없는 상태이며, 아래의 코드를 실행해보면

import os

path1 = r'D:\abc\a\a4'
path2 = r'D:\abc\b\b2\b3'


if not os.path.exists(path1):
    print('path1의 경로를 생성합니다.')
    os.makedirs(path1)    


if not os.path.exists(path2):
    print('path2의 경로를 생성합니다.')
    os.makedirs(path2)

 

 mkdir과는 달리 없는 상위 폴더(b2)는 알아서 생성한 뒤, b3폴더를 생성하는 것을 확인할 수 있다.

반응형

'Python > Tip & Etc' 카테고리의 다른 글

[python] if __name__ == '__main__'  (1) 2023.11.27
python Thread(쓰레드) 병렬처리2(답안)  (0) 2023.11.18
python Thread(쓰레드) 병렬처리  (0) 2023.11.17