Python 프로젝트에서 상대 경로를 사용하여 파일 읽기
예를 들어 다음과 같이 구성된 파이썬 프로젝트가 있다고 가정합니다.
project
/data
test.csv
/package
__init__.py
module.py
main.py
__init__.py
:
from .module import test
module.py
:
import csv
with open("..data/test.csv") as f:
test = [line for line in csv.reader(f)]
main.py
:
import package
print(package.test)
실행할 때main.py
다음 오류가 발생합니다.
C:\Users\Patrick\Desktop\project>python main.py
Traceback (most recent call last):
File "main.py", line 1, in <module>
import package
File "C:\Users\Patrick\Desktop\project\package\__init__.py", line 1, in <module>
from .module import test
File "C:\Users\Patrick\Desktop\project\package\module.py", line 3, in <module>
with open("../data/test.csv") as f:
FileNotFoundError: [Errno 2] No such file or directory: '../data/test.csv'
하지만, 내가 뛰면,module.py
에서package
디렉토리에 오류가 없습니다.그래서 사용된 상대 경로는open(...)
원본 파일이 실행되는 위치에만 상대적입니다(즉,__name__ == "__main__"
절대 경로를 사용하고 싶지 않습니다.이 문제를 해결할 수 있는 방법은 무엇입니까?
상대 경로는 현재 작업 디렉터리를 기준으로 합니다.경로를 상대적으로 만들지 않으려면 경로가 절대적이어야 합니다.
그러나 현재 스크립트에서 절대 경로를 구축하기 위해 자주 사용되는 트릭이 있습니다. 특별한 속성을 사용하십시오.
from pathlib import Path
path = Path(__file__).parent / "../data/test.csv"
with path.open() as f:
test = list(csv.reader(f))
이를 위해서는 pathlib 모듈용 python 3.4+가 필요합니다.
이전 버전을 계속 지원해야 하는 경우 다음과 같은 결과를 얻을 수 있습니다.
import csv
import os.path
my_path = os.path.abspath(os.path.dirname(__file__))
path = os.path.join(my_path, "../data/test.csv")
with open(path) as f:
test = list(csv.reader(f))
[2020 edit: python 3.4+가 이제 표준이 되어야 하기 때문에 jpyams의 코멘트에서 영감을 받은 pathlib 버전을 먼저 이동했습니다.]
Python 3.4+의 경우:
import csv
from pathlib import Path
base_path = Path(__file__).parent
file_path = (base_path / "../data/test.csv").resolve()
with open(file_path) as f:
test = [line for line in csv.reader(f)]
이것은 저에게 효과가 있었습니다.
with open('data/test.csv') as f:
나의 파이썬 버전은 파이썬 3.5.2이며 승인된 답변에서 제안된 솔루션은 나에게 효과가 없었습니다.나는 여전히 오류를 받았습니다.
FileNotFoundError: [Errno 2] 해당 파일 또는 디렉터리가 없습니다.
달리고 있을 때my_script.py
종착역에서PyCharm IDE(PyCharm 2018.3.2(Community Edition))에서 Run/Debug Configuration을 실행했을 때는 문제없이 작동했습니다.
솔루션:
다음을 사용하는 대신:
my_path = os.path.abspath(os.path.dirname(__file__)) + some_rel_dir_path
승인된 답변에서 제안된 대로, 저는 다음을 사용했습니다.
my_path = os.path.abspath(os.path.dirname(os.path.abspath(__file__))) + some_rel_dir_path
설명:
변화하는os.path.dirname(__file__)
로.os.path.dirname(os.path.abspath(__file__))
에서는 다음 문제를 해결합니다.
이렇게 스크립트를 실행할 경우:python3 my_script.py
그__file__
변수의 문자열 값은 "my_script.py"이며 특정 스크립트로 이어지는 경로는 없습니다.그것이 방법입니다.dirname(__file__)
빈 문자열 ""을 반환합니다.그것이 또한 이유입니다.my_path = os.path.abspath(os.path.dirname(__file__)) + some_rel_dir_path
실제로와 같은 것입니다.my_path = some_rel_dir_path
결과적으로FileNotFoundError: [Errno 2] No such file or directory
를 사용하려고 할 때 제공됩니다.open
method: "some_rel_dll_path"와 같은 디렉터리가 없기 때문입니다.
명령을 실행하므로 PyCharm IDE의 실행 스크립트 실행/디버그 구성이 작동했습니다.python3 /full/path/to/my_script.py
(여기서 "/full/path/to"는 실행/디버그 구성의 "작업 디렉토리" 변수에 지정됨)python3 my_script.py
마치 터미널에서 실행할 때 수행되는 것처럼.
해라
with open(f"{os.path.dirname(sys.argv[0])}/data/test.csv", newline='') as f:
저는 다음 코드가 작동했을 때 놀랐습니다.
import os
for file in os.listdir("../FutureBookList"):
if file.endswith(".adoc"):
filename, file_extension = os.path.splitext(file)
print(filename)
print(file_extension)
continue
else:
continue
그래서 문서를 확인해보니 다음과 같이 나와 있습니다.
버전 3.6에서 변경됨: 경로와 유사한 개체를 허용합니다.
경로 유사 개체:
파일 시스템 경로를 나타내는 개체입니다.길 같은 물체는 스트라나...
저는 조금 더 파고들었고 다음과 같은 것들도 작동합니다.
with open("../FutureBookList/file.txt") as file:
data = file.read()
언급URL : https://stackoverflow.com/questions/40416072/reading-a-file-using-a-relative-path-in-a-python-project
'programing' 카테고리의 다른 글
jQuery: 테이블의 행 수 카운트 (0) | 2023.05.18 |
---|---|
null 값에 대한 zure 테이블 저장소 쿼리 (0) | 2023.05.18 |
UITapGesture Recognizer가 있는 뷰 내부의 UIButton (0) | 2023.05.18 |
키 값 데이터 저장소에 디렉터리 계층 저장 (0) | 2023.05.18 |
3차 연산자 VB vs C#: 왜 아무것도 0으로 해결하지 않습니까? (0) | 2023.05.18 |