programing

Python 프로젝트에서 상대 경로를 사용하여 파일 읽기

powerit 2023. 5. 18. 21:31
반응형

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를 사용하려고 할 때 제공됩니다.openmethod: "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

반응형