[Python] 쓰기모드로 파일 열었을 때 FileNotFoundError: [Error 2] No such file or directory/ 파일이름에 사용할 수 없는 기호와 문자
웹 크롤링을 하던 중 에러가 떠서 문제가 되는 부분을 찾아보았더니 "이자녹스/비욘드/네이처컬렉션"라는 문자열을 웹 사이트에서 가져와서 파일이름.csv 해당 파일을 만드려고 할 때 문제가 발생하였다.
import csv
file = open(f"이자녹스/비욘드/네이처컬렉션.csv", mode="w")
writer = csv.writer(file)
writer.writerow(["place","title","time","pay","date"])
file.close()
문제가 생기는 부분만을 코드로 작성해 보았다.
파일을 쓰기모드(w)로 열었을 때 만약 해당 파일이 이미 존재할 경우 원래 있던 내용이 사라지고 그 파일에 쓰기가 되고, 만약 해당 파일이 존재하지 않으면 새로운 파일이 생성되는데 No such file or directory는 무슨 의미일까 싶어서 찾아보았다.
찾아보니 나와 비슷한 문제를 겪고 있는 글을 발견했고 답변에서 파일이름에 슬래시(/)가 포함되면 문제를 발생시킬 수 있다고 한다.
실제로 파일이름에는 사용할 수 없는 기호와 문자가 있었다.
문자 | 이름 | 이유 |
/ | 슬래시 | 유닉스 계열, 윈도, 아미가 시스템에서 경로 이름을 이루는 요소로 이용하므로 사용할 수 없다. (MS-DOS의 command.com 셸은 스위치 문자로 사용할 수 있지만 윈도 자체는 언제나 이를 구분자로 사용한다. |
\ | 백슬래시 | 이 또한 MS-DOS, OS/2, 윈도에서 경로 이름을 이루는 요소로 이용하므로 사용할 수 없다. (슬래시와 백슬래시와의 차이는 없다. 다만 유닉스 파일 이름에서는 이를 사용할 수 있다. 아래의 참고 1을 볼 것.) |
? | 물음표 | 유닉스, 윈도, 아미가OS에서 특수 문자로 취급하며 한 글자라는 뜻으로 이용하므로 사용할 수 없다. 유닉스 파일 이름에서는 이를 사용할 수 있다. |
% | 퍼센트 기호 | RT-11에서 특수 문자로 취급하며 한 글자라는 뜻으로 이용하므로 사용할 수 없다. |
* | 별표 | 유닉스, MS-DOS, RT-11. VMS, 윈도에서 특수 문자로 취급한다. 유닉스, 윈도, 후반 버전의 MS-DOS에서 연속된 문자임을 나타내거나 기반 이름 및 확장자의 연속된 문자라는 뜻으로 이용한다. (그러므로 초기 버전의 MS-DOS에서 "*.*"는 "모든 파일"을 뜻한다. 유닉스의 파일 이름에서는 사용할 수 있다.) |
: | 콜론 | 윈도의 마운트 포인트 / 드라이브를 결정하는 데 사용한다. 아미가OS, RT-11, VMS에서 드라이브와 같은 물리 장치나 가상 장치를 결정하는 데 쓰인다. 고전 맥 OS에서 경로 이름을 구분하는 데 사용한다. VMS의 이름 뒤에 두 개의 콜론이 놓이면 DECnet 노드이름임을 나타낸다. (이는 넷바이오스 (윈도 네트워킹) 호스트 이름의 \\와 일치한다.) |
| | 수직 막대 | 유닉스와 윈도에서 소프트웨어 파이프라인화를 가리킨다. 유닉스 파일 이름에는 사용할 수 있다. |
" | 인용 부호 | 윈도에서 파일 이름에 공백을 포함할 때 파일 이름의 시작과 끝을 알려 주는 데 사용한다. |
< | 보다 작다 기호 | 리디렉션하는 데 사용한다. 유닉스 파일 이름에서는 사용할 수 있다. |
> | 보다 크다 기호 | 리디렉션하는 데 사용한다. 유닉스 파일 이름에서는 사용할 수 있다. |
. | 온점 | VMS, MS-DOS, 윈도의 확장 구분자로 해석할 수 있다. 다른 운영 체제에서 파일 이름의 일부로 인식할 수도 있으며 이 때 하나 이상의 온점도 허용할 수 있다. |
따라서 나는 파일이름에 사용될 문자열을 replace() 함수를 사용해 슬래시(/)를 콤마(,)로 바꾸어 주었다.
import csv
file = open(f"이자녹스,비욘드,네이처컬렉션.csv", mode="w")
writer = csv.writer(file)
writer.writerow(["place","title","time","pay","date"])
file.close()
실제 코드는 아니지만 맨 위의 코드에서 슬래시를 콤마로 바꾸어 주면 에러없이 잘 실행된다.
<참고사이트>
Getting a FileNotFoundError for writing a text file
So I have been trying to write a text file in a specific directory with the following code (note_value and note_title are variables already set to a string) : file = open("resources/user_notes/" +
stackoverflow.com
파일 이름 - 위키백과, 우리 모두의 백과사전
디렉터리 안에 들어 있는 파일의 이름을 보여 주는 윈도우 명령 셸. 파일 이름(영어: filename) 또는 파일명(file名)은 특별한 종류의 문자열이며 컴퓨터의 파일 시스템에서 저장된 파일을 구별하기
ko.wikipedia.org