python 프로그램 내에서 현재 작업 디렉토리를 실행 중인 프로그램 파일의 확장자 .py 파일이 존재하는 디렉토리로 변경할 때와 변경하지 않을 때의 차이점에 대해서 소개하겠습니다.
연습 프로그램 및 테스트 데이터 준비
- [시작 > Windows 시스템 > 명령 프롬프트] 를 실행합니다.
- 명령 프롬프트 창이 열리면 C:\Users\Administrator>와 같은 프롬프트가 표시되며 커서가 깜빡이면서 입력을 기다립니다. 프롬프트에 표시되는 경로 C:\Users\Administrator는 현재 디렉토리를 의미합니다.
- 명령 프롬프트 창에서 다음과 같이 C:\dir1\dir2 경로의 디렉토리를 만들어서 현재 작업 디렉토리로 변경한 후 이곳에 test_nochange.py과 test_change.py 파일 명으로 데이터 파일 data.txt을 읽어서 화면에 출력하는 python프로그램을 작성, 그리고 입력 데이터 파일 data.txt을 준비합니다.
C:\user\administrator> mkdir C:\dir1\dir2
C:\> cd C:\dir1\dir2
C:\dir1\dir2>
- 작성할 test_nochange.py파일은 다음과 같습니다.
import os
with open('data.txt','r') as f:
print(f.read())
- 작성할 test_change.py파일은 다음과 같습니다.
import os
this_program_directory = os.path.dirname(os.path.abspath(__file__))
os.chdir(this_program_directory)
with open('data.txt','r') as f:
print(f.read())
- 작성할 입력 파일 data.txt내용은 다음과 같습니다.
1234567890
abcdefghijklmnopqrstuvwxyz
ABCDEFGHIJKLMNOPQRSTUVWXYZ
- 두 개의 python프로그램과 하나의 텍스트 파일 작성되어 있는지 다음과 같이 dir명령으로 확인합니다.
C:\dir1\dir2> dir
test_nochange.py
test_change.py
data.txt
다른 경로에서 test_nochange.py 실행
- 명령 프롬프트 창에서 현재 작업 디렉토리를 C:\로 변경합니다.
C:\dir1\dir2> cd \
C:\>
- 전체 경로 지정 C:\dir1\dir2\test_nochange.py를 python 또는 py명령으로 실행합니다.
실행 결과는 에러 종료입니다.
C:\>python C:\dir1\dir2\test_nochange.py
Traceback (most recent call last):
File "C:\dir1\dir2\test_nochange.py", line 2, in <module>
with open('data.txt','r') as f:
FileNotFoundError: [Errno 2] No such file or directory: 'data.txt'
- 이유인 즉, 다음 소스 open(‘data.txt’,’r’)의 data.txt를 현재 작업 디렉토리 C:\ 에서 찾고 있습니다. 그러나, 위 연습 파일 준비에서는 C:\dir1\dir2\data.txt 파일을 준비했었기 때문에 C:\data.txt의 파일은 존재하지 않기 때문에 data.txt를 찾을 수 없다는 오류가 발생합니다.
import os
with open('data.txt','r') as f:
print(f.read())
같은 경로에서 test_nochange.py실행
- 명령 프롬프트 창에서 현재 작업 디렉토리를 C:\dir1\dir2로 변경합니다.
C:\> cd C:\dir1\dir2
C:\dir1\dir2>
- test_nochange.py를 python 또는 py명령으로 실행합니다. 실행 결과는 파일의 내용을 행 단위로 반복해서 읽어 화면에 출력합니다. 정상 종료입니다.
C:\dir1\dir2>python test_nochange.py
1234567890
abcdefghijklmnopqrstuvwxyz
ABCDEFGHIJKLMNOPQRSTUVWXYZ
- open(‘data.txt’,’r’)의 data.txt는 현재 작업 디렉토리 C:\dir1\dir2에 찾을 수 있어 다음으로 진행합니다.
import os
with open('data.txt','r') as f:
print(f.read())
다른 경로에서 test_change.py 실행
위의 “다른 경로에서 test_nochange.py 실행“과 같은 방법으로 현재 작업 디렉토리를 C:\로 변경하고 C:\dir1\dir2\test_change.py를 python 또는 py명령으로 실행합니다. 실행 결과는 파일의 내용을 행 단위로 반복해서 읽어 화면에 출력합니다. 정상 종료입니다.
C:\dir1\dir2>cd \
C:\>python C:\dir1\dir2\test_change.py
1234567890
abcdefghijklmnopqrstuvwxyz
ABCDEFGHIJKLMNOPQRSTUVWXYZ
정상 종료한 이유는 test_change.py프로그램의 다음 두 줄의 코드에 있습니다.
this_program_directory = os.path.dirname(os.path.abspath(__file__))
os.chdir(this_program_directory)
이 코드의 자세한 동작은 다음과 같습니다.
- __file__는 실행 파일(test_change.py) 자신을 가리키고 있습니다.
- os.path.abspath 함수는 실행 파일(test_change.py)에 대한 자신의 C:\dir1\dir2\test_change.py 전체 경로를 취득합니다.
- os.path.dirname 함수는 위 2.의 취득 결과에서 파일 명을 제외한 경로 C:\dir1\dir2를 취득합니다.
- os.chdir 함수는 위 3.의 취득 경로 C:\dir1\dir2로 현재 작업 디렉토리를 변경합니다.
- 결과적으로 open(‘data.txt’,’r’)의 data.txt는 위 4.에서 변경된 현재 작업 디렉토리 C:\dir1\dir2에서 취득 됩니다.
주의) open(‘C:\abc\data.txt’,’r’) 와 같이 입력 파일 data.txt가 전체 경로로 지정되어 있는 경우는 현재 작업 디렉토리 변경은 영향을 주지 않습니다.