python 파일(확장자 .py) 자신의 위치로 현재 작업 디렉토리 변경하기

스폰서 링크
python post logo 파이썬
스폰서 링크

python 프로그램 내에서 현재 작업 디렉토리를 실행 중인 프로그램 파일의 확장자 .py 파일이 존재하는 디렉토리로 변경할 때와 변경하지 않을 때의 차이점에 대해서 소개하겠습니다.

스폰서 링크

연습 프로그램 및 테스트 데이터 준비

  1. [시작 > Windows 시스템 > 명령 프롬프트] 를 실행합니다.
  1. 명령 프롬프트 창이 열리면 C:\Users\Administrator>와 같은 프롬프트가 표시되며 커서가 깜빡이면서 입력을 기다립니다. 프롬프트에 표시되는 경로 C:\Users\Administrator는 현재 디렉토리를 의미합니다.
  1. 명령 프롬프트 창에서 다음과 같이 C:\dir1\dir2 경로의 디렉토리를 만들어서 현재 작업 디렉토리로 변경한 후 이곳에 test_nochange.pytest_change.py 파일 명으로 데이터 파일 data.txt을 읽어서 화면에 출력하는 python프로그램을 작성, 그리고 입력 데이터 파일 data.txt을 준비합니다.
C:\user\administrator> mkdir C:\dir1\dir2
C:\> cd C:\dir1\dir2
C:\dir1\dir2>
  1. 작성할 test_nochange.py파일은 다음과 같습니다.
import os
with open('data.txt','r') as f:
    print(f.read())
  1. 작성할 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())
  1. 작성할 입력 파일 data.txt내용은 다음과 같습니다.
1234567890
abcdefghijklmnopqrstuvwxyz
ABCDEFGHIJKLMNOPQRSTUVWXYZ
  1. 두 개의 python프로그램과 하나의 텍스트 파일 작성되어 있는지 다음과 같이 dir명령으로 확인합니다.
C:\dir1\dir2> dir
test_nochange.py
test_change.py
data.txt

다른 경로에서 test_nochange.py 실행

  1. 명령 프롬프트 창에서 현재 작업 디렉토리 C:\로 변경합니다.
C:\dir1\dir2> cd \
C:\>
  1. 전체 경로 지정 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'
  1. 이유인 즉, 다음 소스 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실행

  1. 명령 프롬프트 창에서 현재 작업 디렉토리를 C:\dir1\dir2로 변경합니다.
C:\> cd C:\dir1\dir2
C:\dir1\dir2> 
  1. test_nochange.py를 python 또는 py명령으로 실행합니다. 실행 결과는 파일의 내용을 행 단위로 반복해서 읽어 화면에 출력합니다. 정상 종료입니다.
C:\dir1\dir2>python test_nochange.py
1234567890
abcdefghijklmnopqrstuvwxyz
ABCDEFGHIJKLMNOPQRSTUVWXYZ
  1. 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)

이 코드의 자세한 동작은 다음과 같습니다.

  1. __file__는 실행 파일(test_change.py) 자신을 가리키고 있습니다.
  2. os.path.abspath 함수는 실행 파일(test_change.py)에 대한 자신의 C:\dir1\dir2\test_change.py 전체 경로를 취득합니다.
  3. os.path.dirname 함수는 위 2.의 취득 결과에서 파일 명을 제외한 경로 C:\dir1\dir2를 취득합니다.
  4. os.chdir 함수는 위 3.의 취득 경로 C:\dir1\dir2로 현재 작업 디렉토리를 변경합니다.
  5. 결과적으로 open(‘data.txt’,’r’)data.txt는 위 4.에서 변경된 현재 작업 디렉토리 C:\dir1\dir2에서 취득 됩니다.

주의) open(‘C:\abc\data.txt’,’r’) 와 같이 입력 파일 data.txt가 전체 경로로 지정되어 있는 경우는 현재 작업 디렉토리 변경은 영향을 주지 않습니다.

제목과 URL을 복사했습니다