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 |