본문 바로가기
Python/Python Advanced

6. Python - os 모듈: chdir(), listdir(), getcwd() 함수

by Rosmary 2020. 8. 17.
728x90
반응형

 

 

간만의 Python 포스팅이다. 지난 포스팅에서는 파이썬의 기본 모듈인 OS 모듈에서 사용할 수 있는 system() 함수에 대해 알아보았다. system() 함수는 운영체제의 명령어를 Python에서 바로 사용할 수 있도록 도와주는 함수임을 확인해보았다. 

 

그런데, system() 함수를 import 하여 이런 저런 명령어의 결과를 확인해보다보면, cd 명령어를 사용했음에도 불구하고, 다른 폴더의 파일을 인식하지 못하거나, 현재 작업 폴더 경로나 폴더 내 파일 목록을 변수에 저장할 수 없음을 발견하신 분들도 있을 것이다. 아래의 예시를 보자.

 

 

분명 system 함수를 사용하여 cd로 디렉토리 이동 명령어를 수행했음에도 불구하고, 현재 작업중인 디렉토리 경로는 변하지 않고 "blitz" 폴더에 머물러있는 것을 확인할 수 있다. 혹은,

 

 

위와 같이 파일 경로나 폴더 내 파일 목록을, system() 함수와 cmd 명령어를 조합하여 변수로 저장했음에도 불구하고, 해당 변수를 출력해보면 결과가 0으로만 출력되는 경우도 확인할 수 있다. 이러한 결과가 나타나는 이유는, 위에서 사용한 명령어들(cd / dir)이 Python으로 돌려주는 결과가 0이기 때문이다. 따라서 system() 함수를 이용하여 해당 명령어를 Python에서 실행하면 return 0 구문에 의해 폴더 경로 이동이 되지 않거나 변수로 저장되는 값이 0만 되는 것이다.

 

다행히 Python의 os 모듈에서는 이러한 문제점으로 인해 생성된 메소드(함수)들이 존재한다. 바로 chdir(), listdir() 그리고 getcwd() 함수다. 이들 함수는 os 명령어 실행 후, 돌아오는 결과값을 0이 아닌 값으로 Python에 돌려주며, 이로 인해 Python 내부에서도 실제 cmd에서 명령어를 사용한 것과 동일한 결과가 나타나도록 만들어준다. 하나씩 살펴보자. 

 

 

1. chdir() 함수: Python에서의 폴더 이동

 

현재 필자가 위치한 폴더 경로는 "C:\Users\Blitz" 폴더다. 이 폴더 밑에는 window Desktop 폴더가 존재하고 있다. system("cd Desktop") 명령어로는 Python 내부에서 폴더 이동이 되지 않은 것을 위에서 확인할 수 있었는데, 이를 대체하여 사용할 수 있는 os 모듈의 메소드가 chdir()다. 

 

 

chdir() 함수 내에는 이동할 경로를 절대 경로나 상대 경로로 작성해주면 된다. 위의 예시는 blitz 폴더 내에 존재하는 Desktop 폴더로 이동하기 위해 상대 경로를 작성해 준 것이다. chdir() 메소드 내부에 들어가는 인자는 경로를 변수로 지정하여 사용하는 것도 가능하다.

 

 

 

2.  getcwd:  현재 폴더 경로를 변수로 저장

 

system() 메소드 인자를 cmd 명령어인 cd를 이용하여 결과를 확인하면, 현재 Python이 참조하는 working directory 경로가 화면에 나타난다. 하지만 이 명령어가 Python에 돌려주는 값은 0이기 때문에 system("cd")의 결과를 변수에 저장하더라도 변수 값이 0으로만 출력된다. 

 

os 모듈에서는 현재 경로를 변수로 저장할 수 있는 메소드 역시 별도로 제공한다. getcwd() 메소드가 그것인데, 이 메소드의 이름이 get Current Working Directory의 줄임말임을 알게 된다면 그 기능을 충분히 이해할 수 있다. 이 메소드는 0 값 대신, 현재 경로를 string 형태로 Python으로 반환한다.

 

 

getcwd() 메소드는 현재 python이 위치한 경로에 대해서만 변수로 저장하기 때문에, 프로그래밍에서는 프로그램 코드 중 특정 프로세스가 특정 경로에서만 돌아야되는 경우, 폴더 경로를 검증하는 용도로 많이 쓰인다. 예를 들면, window의 hosts 파일의 내용을 확인하기 전에, Python이 hosts 파일이 위치한 경로에 정확히 이동한 상태인지 확인할 때 사용할 수 있다. 

 

 

 

 

3. listdir() :  현재 폴더의 목록을 list 변수로 저장

 

system("dir")의 결과 역시 0으로 Python에 결과값을 돌리는 탓에, 특정 폴더 내의 파일 목록을 변수화하기가 매우 어렵다. os 모듈은 이러한 문제를 해결할 수 있는 메소드 역시 제공하고 있는데, 이 메소드가 listdir()다. 이름을 보면 알 수 있겠지만, directory 내의 list를 표시하고 그 값을 돌려주는 메소드다. 

 

특이하게도 이 listdir() 메소드는 결과값을 string 형태가 아닌 list 형태로 돌려준다. 생각해보면 list 형태로 돌려주는 것이 당연한데, 여러 파일이 하나의 폴더에 존재하는 경우 이를 string 형태로 돌려주어봐야 해당 결과값으로 진행할 수 있는 작업이 마땅치 않기 때문이다. 

 

 

이 listdir() 메소드 역시, getcwd() 메소드와 함께 프로그램이 특정 경로에 위치하는지, 그리고 해당 경로에 특정 파일이 존재하는지 여부를 확인하기 위해 사용한다. 기능 특성 상, getcwd()보다는 listdir()가 프로그램 상에서는 더 자주 사용된다. 

 


 

이번 포스팅에서는 os 모듈의 system() 함수로 사용하기 어려운 명령어를 대체할 수 있는 메소드인 chdir(), listdir(), getcwd() 메소드에 대해 알아보았다. 사실 os 모듈은 운영체제에서 제공하는 명령어 중, system() 메소드와 함께 사용할 경우 정상적으로 사용되는 명령어를 대체할 수 있는 메소드도 제공하고 있다. 이는 python 인터렉티브 모드에서 os 모듈을 import 하고 dir(os) 명령어를 사용함으로써 확인할 수 있다. mkdir이나 removedir와 같은 메소드 등을 예시로 들 수 있다. 

 

 

 

 

FIN.

 

 

 

 

 

반응형

댓글