no such file or directory 오류
파이썬에서 파일 입출력을 가지고 작업을 하다 보면 아래와 같은 오류를 만날 때가 있습니다.
filenotfounderror: [errno 2] no such file or directory
이는 말 그대로 내가 무언가를 작업하라고 지시한 파일이나 디렉토리가 존재하지 않아서 발생하는 오류입니다.
우리는 작업을 할 때, 일반적으로 '여기에 있는 이런 이름을 가진 파일을 열어줘' 와 같은 방식으로 path를 알려주게 됩니다.
# revegetate.in 이라는 파일을 읽기 모드로 열겠다는 의미입니다.
input_file = open('revegetate.in', 'r')
input_file.close()
FileNotFoundError: [Errno 2] No such file or directory: 'revegetate.in'
그런데 해당 오류는 파이썬이 네가 알려준 대로 찾아봤더니 그런 파일이 없는데 라고 대답한 것이죠.
분명 이름에 오타도 없고 이상이 없는 것 같은데 이런 오류가 난다면, 파이썬이 이상한 곳에서 해당 파일을 찾아보고는 없다고 말하고 있을 가능성이 높습니다. 아니.. 대체 어디에서 찾는 중이길래 자꾸 파일이 없다고 하는 걸까요?
이번에는 아예 탐색기로 가서 파일의 전체 위치를 가져와서 전달해 주겠습니다.
# c:\Users\codingtest-python\review\revegetate.in 라고 파일의 위치까지 절대경로로 함께 전달해 주었습니다.
input_file = open('c:\\Users\\codingtest-python\\review\\revegetate.in', 'r')
input_file.close()
단, 여기서 한 가지 주의해야 할 점은 이렇게 전체 주소를 그대로 복사해서 붙여넣기 하는 경우 아래와 같이 \ 로 주소가 구분되는 모습을 볼 수 있는데, 이럴 경우 오류가 발생합니다.
SyntaxError: (unicode error) 'unicodeescape' codec can't decode bytes in position 2-3: truncated \UXXXXXXXX escape
내용을 보면 이스케이프 처리에서 문제가 발생한 것을 확인할 수 있는데요.
파이썬에서 \는 이스케이프 문자로, \n \r 과 같이 사용되는데, 파일 경로를 표시하는 데 있어서 사용되는 \는 이스케이프 문자가 아닌 단순 문자열의 의미이기 때문에 이를 해결하려면 이스케이프 문자로 사용하는 경우와 구분이 필요합니다.
# 이렇게 주소 사이에 \ 가 포함되어 있으면 오류.
input_file = open('c:\Users\codingtest-python\review\revegetate.in', 'r')
SyntaxError: (unicode error) 'unicodeescape' codec can't decode bytes in position 2-3: truncated \UXXXXXXXX escape
따라서 이런 경우에는 \가 이스케이프 문자가 아니라는 것을 알려주기 위해 \\ 이렇게 두번 사용해 주면 됩니다.
혹은, \를 /로 모두 바꿔주어도 정상적으로 실행됩니다.
# 두 경우 모두 오류없이 실행
input_file = open('c:/Users/codingtest-python/review/revegetate.in', 'r')
input_file = open('c:\\Users\\codingtest-python\\review\\revegetate.in', 'r')
다시 본론으로 돌아와서, 이렇게 파일명 뿐만 아니라 파일의 위치까지 모두 전달해 주면 파이썬이 정상적으로 해당 파일을 열어주는 것을 확인할 수 있습니다.
# 정상 실행
input_file = open('c:\\Users\\codingtest-python\\review\\revegetate.in', 'r')
input_file.close()
이 차이가 생기는 이유는 파이썬은 주어진 파일이나 디렉토리를 찾을 때, 현재 작업 중인 디렉토리를 기준으로 찾기 때문입니다. 예를 들어 'revegetate.in'과 같이 파일 이름만을 주면 파이썬이 현재 작업 중인 디렉토리 내에서 검색하고, 해당 디렉토리 내에 파일이 없으면 filenotfounderror를 발생시키는 것입니다.
반면 c:\Users\codingtest-python\review\revegetate.in 이런 식으로 절대경로로 제공해 준다면 현재 작업중인 디렉토리가 아니어도 경로를 확인해 해당 파일을 열어줄 수 있게 됩니다.
그렇다면 지금 현재 작업중인 디렉토리가 어디인지 어떻게 확인할 수 있을까요?
작업 중인 디렉토리 확인하기 : getcwd()
import os
cwd = os.getcwd()
print(cwd) # C:\Users\codingtest-python
os 모듈의 getcwd() 함수를 이용하면 현재 작업 중인 디렉토리의 주소를 확인할 수 있습니다.
저의 경우는 C:\Users\codingtest-python 이었네요. 제가 열고자 했던 revegetate.in 파일은 C:\Users\codingtest-python\review 아래에 있었기 때문에, 아무리 작업 중인 곳에서 찾아봤자 no such file or directory 오류만 떴던 것입니다.
여기까지 알고 나면, 그럼 현재 작업중인 디렉토리의 위치를 바꿔서 파일을 열 수도 있지 않을까? 하는 생각이 드는데요. 이 방법도 물론 가능합니다!
작업 중인 디렉토리 원하는 path로 변경하기 : chdir()
import os
# 기존 디렉터리 확인
cwd = os.getcwd()
print(cwd) # C:\Users\codingtest-python
# 원하는 path로 변경
os.chdir("C:\\Users\\eseon\\codingtest-python\\review")
cwd = os.getcwd()
print(cwd) # C:\Users\codingtest-python\review
# 디렉토리가 변경되었으므로, 파일 이름만 전달해도 정상 실행
input_file = open('revegetate.in', 'r')
input_file.close()
동일한 os 모듈의 chdir()를 이용합니다. 파라미터로 path를 전달하여 원하는 경로로 바꾸어 줄 수 있습니다.
이제 작업중인 디렉토리가 변경되었기 때문에 파일을 open 함수로 열려는 경우 바뀐 디렉토리에서 새로 검색하게 됩니다. 따라서 해당 파일이 위치한 곳에서 작업 중인 것으로 경로가 바뀌었기 때문에 이제 절대 경로가 아니어도 오류 없이 파일 열기가 실행됩니다.
단 이렇게 변경하게 되면 이전 디렉토리에 맞춰진 파일 경로가 있을 경우 오류로 접근이 불가능해질 수 있기 때문에, 주의가 필요합니다.
os 모듈 내 파일과 디렉터리 관련 더 자세한 내용은 파이썬 공식 문서를 참조하세요.
'python' 카테고리의 다른 글
[python] string 문자열 관련 메서드 간단 정리 (0) | 2023.09.29 |
---|---|
[python] bisect_left와 bisect_right 이해하기 (0) | 2023.08.15 |
[python] 파이썬 리스트 extend 함수값이 none으로 나오는 이유 (0) | 2023.06.29 |
[python] 리스트 내용 출력하기 (list print) (0) | 2023.05.25 |