programing

Python의 상대적인 위치에서 파일 열기

showcode 2023. 6. 19. 21:46
반응형

Python의 상대적인 위치에서 파일 열기

내 파이썬 코드가 다음 디렉토리를 실행한다고 가정합니다.main애플리케이션에 액세스해야 합니다.main/2091/data.txt.

사용 방법open(location)매개 변수가 무엇이어야 합니까?location무엇입니까?

아래의 간단한 코드가 작동한다는 것을 알았습니다.단점이 있습니까?

file = "\2091\sample.txt"
path = os.getcwd()+file
fp = open(path, 'r+');

이러한 유형의 작업에서는 실제 작업 디렉터리가 무엇인지 주의해야 합니다.예를 들어 파일이 있는 디렉터리에서 스크립트를 실행할 수 없습니다.이 경우, 상대 경로를 단독으로 사용할 수 없습니다.

원하는 파일이 스크립트가 실제로 위치한 하위 디렉터리에 있는 것이 확실하면 다음을 사용할 수 있습니다.__file__여기서 당신을 도우려고요 __file__실행 중인 스크립트가 있는 위치의 전체 경로입니다.

그래서 여러분은 다음과 같은 것을 다룰 수 있습니다.

import os
script_dir = os.path.dirname(__file__) #<-- absolute dir the script is in
rel_path = "2091/data.txt"
abs_file_path = os.path.join(script_dir, rel_path)

이 코드는 정상적으로 작동합니다.

import os

def read_file(file_name):
    file_handle = open(file_name)
    print file_handle.read()
    file_handle.close()

file_dir = os.path.dirname(os.path.realpath('__file__'))
print file_dir

#For accessing the file in the same folder
file_name = "same.txt"
read_file(file_name)

#For accessing the file in a folder contained in the current folder
file_name = os.path.join(file_dir, 'Folder1.1/same.txt')
read_file(file_name)

#For accessing the file in the parent folder of the current folder
file_name = os.path.join(file_dir, '../same.txt')
read_file(file_name)

#For accessing the file inside a sibling folder.
file_name = os.path.join(file_dir, '../Folder2/same.txt')
file_name = os.path.abspath(os.path.realpath(file_name))
print file_name
read_file(file_name)

저는 Russ의 원래 답변에서 제가 발견한 불일치를 명확히 하기 위해 계정을 만들었습니다.

참고로, 그의 원래 대답은 다음과 같습니다.

import os
script_dir = os.path.dirname(__file__)
rel_path = "2091/data.txt"
abs_file_path = os.path.join(script_dir, rel_path)

원하는 파일에 대한 절대 시스템 경로를 동적으로 생성하려고 하므로 이 방법은 매우 유용합니다.

코리 모워터가 알아차린 것은__file__는 상대 경로(내 시스템에서도 마찬가지)이며 다음을 사용하여 제안됩니다.os.path.abspath(__file__).os.path.abspath그러나 현재 스크립트의 절대 경로를 반환합니다(즉,/path/to/dir/foobar.py)

이 메서드를 사용하려면(그리고 최종적으로 어떻게 작동했는지) 경로 끝에서 스크립트 이름을 제거해야 합니다.

import os
script_path = os.path.abspath(__file__) # i.e. /path/to/dir/foobar.py
script_dir = os.path.split(script_path)[0] #i.e. /path/to/dir/
rel_path = "2091/data.txt"
abs_file_path = os.path.join(script_dir, rel_path)

결과 abs_file_path(이 예에서는)는 다음과 같습니다./path/to/dir/2091/data.txt

사용하는 운영 체제에 따라 다릅니다.Windows 및 *nix와 모두 호환되는 솔루션을 원하는 경우 다음과 같습니다.

from os import path

file_path = path.relpath("2091/data.txt")
with open(file_path) as f:
    <do stuff>

잘 작동할 겁니다.

path모듈은 실행 중인 운영 체제에 대한 경로를 포맷할 수 있습니다.또한 python은 올바른 권한만 있으면 상대 경로를 잘 처리합니다.

편집:

kindall이 코멘트에서 언급했듯이, python은 unix-style 경로와 windows-style 경로 사이에서 변환할 수 있으므로 더 간단한 코드도 작동합니다.

with open("2091/data/txt") as f:
    <do stuff>

그렇긴 하지만, 모듈은 여전히 몇 가지 유용한 기능을 가지고 있습니다.

Windows 시스템에서 Python 3을 실행하는 파일을 코드가 찾을 수 없는 이유를 찾기 위해 많은 시간을 소비합니다.그래서 전에 추가했습니다. 모든 것이 잘 작동했습니다.

import os

script_dir = os.path.dirname(__file__)
file_path = os.path.join(script_dir, './output03.txt')
print(file_path)
fptr = open(file_path, 'w')

사용해 보십시오.

from pathlib import Path

data_folder = Path("/relative/path")
file_to_open = data_folder / "file.pdf"

f = open(file_to_open)

print(f.read())

Python 3.4는 pathlib라고 불리는 파일과 경로를 처리하기 위한 새로운 표준 라이브러리를 도입했습니다.나에게는 그게 효과가 있어요!

코드:

import os
script_path = os.path.abspath(__file__) 
path_list = script_path.split(os.sep)
script_directory = path_list[0:len(path_list)-1]
rel_path = "main/2091/data.txt"
path = "/".join(script_directory) + "/" + rel_path

설명:

라이브러리 가져오기:

import os

사용하다__file__현재 스크립트의 경로에 도달하는 방법:

script_path = os.path.abspath(__file__)

스크립트 경로를 여러 항목으로 구분합니다.

path_list = script_path.split(os.sep)

목록의 마지막 항목(실제 스크립트 파일)을 제거합니다.

script_directory = path_list[0:len(path_list)-1]

상대 파일 경로 추가:

rel_path = "main/2091/data.txt

목록 항목을 결합하고 상대 경로의 파일을 추가합니다.

path = "/".join(script_directory) + "/" + rel_path

이제 다음과 같은 파일로 원하는 모든 작업을 수행하도록 설정되었습니다.

file = open(path)
import os
def file_path(relative_path):
    dir = os.path.dirname(os.path.abspath(__file__))
    split_path = relative_path.split("/")
    new_path = os.path.join(dir, *split_path)
    return new_path

with open(file_path("2091/data.txt"), "w") as f:
    f.write("Powerful you have become.")

파일이 부모 폴더에 있는 경우(예: 팔로워). txt, 당은간사수용있다니습할단히신▁t를 사용하면 .open('../follower.txt', 'r').read()

상위 폴더의 경로를 가져온 다음os.join당신의 관련 파일들은 끝까지.

# get parent folder with `os.path`
import os.path

BASE_DIR = os.path.dirname(os.path.abspath(__file__))

# now use BASE_DIR to get a file relative to the current script
os.path.join(BASE_DIR, "config.yaml")

것.pathlib:

# get parent folder with `pathlib`'s Path
from pathlib import Path

BASE_DIR = Path(__file__).absolute().parent

# now use BASE_DIR to get a file relative to the current script
BASE_DIR / "config.yaml"

Python은 사용자가 제공한 파일 이름을 운영 체제에 전달하기만 하면 파일이 열립니다. 중인 가 운영 다같상은경지와 같은 main/2091/data.txt그럼 잘 될 거예요

이런 질문에 대답하는 가장 쉬운 방법은 시도해보고 무슨 일이 일어나는지 보는 것입니다.

이것이 어디에서나 효과가 있는지 확실하지 않습니다.

나는 우분투에서 ipython을 사용하고 있습니다.

현재 폴더의 하위 디렉토리에 있는 파일을 읽으려면 다음을 수행합니다.

/current-folder/sub-directory/data.csv

스크립트가 현재 폴더에 있습니다. 다음을 수행하십시오.

import pandas as pd
path = './sub-directory/data.csv'
pd.read_csv(path)

Python 3.4(PEP 428)에서는 객체 지향 방식으로 파일을 작업할 수 있도록 다음과 같은 기능이 도입되었습니다.

from pathlib import Path

working_directory = Path(os.getcwd())
path = working_directory / "2091" / "sample.txt"
with path.open('r+') as fp:
    # do magic

또한 이 키워드를 사용하면 처리되지 않은 문제(예: 처리되지 않은 문제)가 발생하더라도 리소스가 올바르게 닫힙니다.Exception서명 또는 유사)

제가 초보자였을 때 저는 이 설명들이 약간 위협적이라는 것을 알았습니다.처음처럼 나는 노력할 것입니다.

f= open('C:\Users\chidu\Desktop\Skipper New\Special_Note.txt','w+')
print(f) 

그리고 이것은 문제를 일으킬 것입니다.syntax error저는 자주 헷갈리곤 했어요.그리고 구글에서 서핑을 좀 한 후에.오류가 발생한 이유를 찾았습니다.초보자를 위한 글입니다.

유니코드에서 경로를 읽기 위해서는 단순히 a를 추가하기 때문입니다.\ 경로를 때 작시로파시▁when▁starting

f= open('C:\\Users\chidu\Desktop\Skipper New\Special_Note.txt','w+')
print(f)

그리고 이제 작동합니다.\디렉터리를 시작하기 전에.

언급URL : https://stackoverflow.com/questions/7165749/open-file-in-a-relative-location-in-python

반응형