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을 더해줍니다.
그리고 \는 제어 문자를 위한 이스케이프입니다. 따라서 \ 문자 자체를 찾을 때는 \를 두 번 써야 합니다.
문자열 앞에 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