"Life is too short, You need python"
OSError: [Errno 22] Invalid argument: 'd:\nolife\\pandas\\subject_grade.xlsx'
파일 경로를 포함된 코드에서 위와 같은 오류가 발생하는 경우가 종종 발생합니다.
위와 같은 오류 발생 시 대처 방법에 대해 알아보도록 하겠습니다.
에러( Error ) 소개
OSError:
OSError 예외(exception)는 시스템 함수가 시스템 관련 에러를 돌려줄 때 발생하는데,
“파일을 찾을 수 없습니다(file not found)” 나 “디스크가 꽉 찼습니다(disk full)” 와 같은
(잘못된 인자형이나 다른 부수적인 에러가 아닌) 입출력 실패를 포함합니다.
[Errno 22] Invalid argument:
이름에서 알 수 있듯이 잘못된 인수(Invalid Argument)가 함수에 전달되면 잘못된 인수 오류가 발생합니다.
이는 함수가 예상했던 데이터 유형과 다른 인수를 받은 경우 발생합니다.
' OSError: [Errno 22] Invalid argument ' while using read_excel() / read_csv(), open()
open()은 파일을 여는데 사용이 되는 함수이며 파일 객체를 반환합니다. 따라서 읽기, 쓰기, 만들기 또는 추가 모드에서 파일을 열 수 있습니다. read_excel()/read_csv()는 파이썬에서 파일을 읽는 데 사용되는 pandas 함수입니다. URL 또는 로컬로 액세스하여 xlsx / csv 파일을 읽을 수 있습니다.
아래 예시를 통해 보도록 하겠습니다.
import pandas as pd
df_score = pd.read_excel('d:\nolife\pandas\subject_grade.xlsx')
print(df_score)
위의 코드는 아래와 같은 에러 메세지를 반환합니다.
OSError: [Errno 22] Invalid argument: 'd:\nolife\\pandas\\subject_grade.xlsx'
오류의 원인은 파이썬이 'd:\nolife\pandas.....'에서 '\n'을 이스케이프 문자로 인식하기 때문입니다.
해결 방법은
1) 경로 앞에 r을 붙여 r'd:\nolife\pandas.....'와 같이 사용하면 따옴표 내의 file path 전체를 'raw string' 즉 문자열 자체로 인식하게 되어 오류가 해결됩니다.
2) 다른 방법으로는 '\(백슬래시)'를 '/(슬래시)'로 대체하는 방법도 있습니다.
* 이스케이프 문자( Escape Sequesces for Special Characters )
\(백슬래시)로 이루어진 특수한 의미를 가진 문자
이스케이프 문자 | 이 름 | 아스키 값(Numeric Value) |
\b | 백스페이스 (Backspace) | 8 |
\t | 탭 (Tab) | 9 |
\n | 라인피드 (Linefeed) | 10 |
\f | 폼피드 (Formfeed) | 12 |
\r | 캐리지 (Carriage Return) | 13 |
\\ | 역슬래시 (Backslash) | 92 |
\' | 작은 따옴표 (Single Quote) | 39 |
\" | 큰 따옴표 (Double Quote) | 34 |
' OSError: [Errno 22] Invalid argument ' while using open()
image = open("C:/image1.jpg")
백슬래시 문자를 슬래시로 교체한 경우에도 open() 함수를 사용하여 이미지를 열 때 위의 오류가 나타날 수 있습니다. 예제를 사용하여 오류를 살펴보겠습니다.
Traceback (most recent call last):
File "<pyshell#13>", line 1, in <module>
image = open("C:/image1.jpg")
OSError: [Errno 22] Invalid argument: '\u202aC:/image1.jpg'
오류의 원인은 주로 파일 경로 복사로 인해 발생합니다. 로컬 시스템이나 인터넷에서 파일 경로 복사 시 유니코드 문자도 복사되는 경우가 있습니다. 위의 예에서 유니코드 문자 '\u202a'는 파일 경로 이름에 표시되지 않습니다. '\u202a'는 왼쪽에서 오른쪽으로 포함하는 유니코드 제어 문자입니다. 따라서 위의 oserror 잘못된 인수가 발생합니다.
해결 방법은 URL을 복사하여 붙여넣지 않고 수동으로 입력하면 됩니다.
그 외
1. 파일 경로명에 잘못된 값( ex) /, \, :, *, ?, ", <, >, | )이 포함된 경우
마무리
에러코드 OSError: [Errno 22]의 발생 원인과 해결 방법에 대해 알아보았습니다. 위에서 언급한 원인이나 해결 방안으로 해결이 되지 않는 Case가 있다면 댓글로 주시면 업데이트 하도록 하겠습니다.