24.4 연습문제: 파일 경로에서 파일명만 가져오기

다음 소스 코드를 완성하여 파일 경로에서 파일명만 출력되게 만드세요. 단, 경로에서 폴더의 깊이가 달라지더라도 파일명만 출력할 수 있어야 합니다.

practice_string_path.py

path = 'C:\\Users\\dojang\\AppData\\Local\\Programs\\Python\\Python36-32\\python.exe'
                                      
...
                                      
 
print(filename)

실행 결과

python.exe

정답

x = path.split('\\')
filename = x[-1]
또는
x = path.split('\\')
x.reverse()
filename = x[0]
또는
filename = path[path.rfind('\\') + 1:]

해설

파일 경로 path에서 파일명만 출력해야 하는데 경로에서 폴더의 깊이는 달라질 수 있다고 했습니다. 그래서 다음과 같이 path.split('\\')를 사용해서 path'\\' 기준으로 분리한 뒤 리스트에서 마지막 요소 직접 가져오면 폴더의 깊이가 달라졌을 때 파일명을 가져올 수 없습니다.

x = path.split('\\')
filename = x[8]    # 폴더의 깊이가 달라졌을 파일명을 가져올 수 없음

이때는 filename = x[-1]과 같이 인덱스를 -1로 지정해서 마지막 요소를 가져오면 됩니다.

또는, reverse로 리스트의 순서를 뒤집어준 뒤 filename = x[0]처럼 첫 번째 요소를 가져오면 파일명을 가져올 수 있습니다. 파일 경로에서 항상 마지막은 파일명이므로 리스트의 순서를 뒤집으면 첫번째 요소가 파일명이 됩니다. 이렇게 하면 폴더의 깊이가 달라지더라도 파일명을 가져올 수 있습니다.

이 방법 이외에도 rfind를 사용해서 파일명을 구할 수 있습니다. 파일 경로에서 파일명은 항상 마지막에 있으므로 path.rfind('\\')와 같이 rfind를 사용하여 오른쪽에서부터 '\\'의 인덱스를 찾습니다. 그리고 path[path.rfind('\\') + 1:]와 같이 찾은 인덱스 + 1부터 문자열의 마지막까지 가져오면 파일명을 가져올 수 있습니다. 즉, path.rfind('\\')로 찾은 인덱스는 '\\'의 인덱스이므로 '\\' 다음에 있는 파일명만 구하기 위해서 1을 더해줍니다.

그리고 \는 제어 문자를 위한 이스케이프입니다. 따라서 \ 문자 자체를 찾을 때는 \를 두 번 써야 합니다.

참고 | raw 문자열 사용하기

문자열 앞에 r 또는 R을 붙이면 raw 문자열이 됩니다. 이 raw 문자열은 이스케이프 시퀀스를 그대로 저장할 때 사용합니다. 즉, 다음과 같이 \\\로 두 번 쓰지 않고 한 번만 써도 됩니다.

>>> print(r'C:\Users\dojang\AppData\Local\Programs\Python\Python36-32\python.exe')
C:\Users\dojang\AppData\Local\Programs\Python\Python36-32\python.exe

raw는 가공되지 않고 있는 그대로라는 뜻입니다. 따라서 이스케이프 시퀀스를 문자 그대로 표현합니다. 다음과 같이 raw 문자열에 제어 문자를 입력해보면 제어 문자가 동작하지 않는 것을 볼 수 있습니다.

>>> print(r'1\n2\n3\n')
1\n2\n3\n