Open bestand op een relatieve locatie in Python

Stel dat Python-code wordt uitgevoerd in niet bekend in de directory van de volgende Windows, zegt ‘hoofd’ en waar code is geïnstalleerd wanneer het wordt uitgevoerd wanneer deze wordt uitgevoerd om toegang te krijgen tot de directory ‘Main / 2091 / Data.txt’.

Hoe moet ik open (locatie) gebruiken? Wat moet locatie zijn?

EDIT:

Ik vond dat hieronder een eenvoudige code werkt .. Heeft het een nadelen?

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

Antwoord 1, Autoriteit 100%

Met dit type ding moet je voorzichtig zijn met wat je werkelijke werkmap is. U mag bijvoorbeeld niet het script uit de map uitvoeren waarin het bestand is. In dit geval kunt u niet alleen een relatief pad gebruiken.

Als u zeker weet dat het gewenste bestand zich in een subdirectory bevindt, onder waar het script zich bevindt, kunt u __file__gebruiken om u hier te helpen. __file__is het volledige pad naar waar het meningsscript wordt uitgevoerd, bevindt zich.

, zodat u met zoiets kunt viemen:

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)

Antwoord 2, Autoriteit 19%

Deze code werkt prima:

import os
def readFile(filename):
    filehandle = open(filename)
    print filehandle.read()
    filehandle.close()
fileDir = os.path.dirname(os.path.realpath('__file__'))
print fileDir
#For accessing the file in the same folder
filename = "same.txt"
readFile(filename)
#For accessing the file in a folder contained in the current folder
filename = os.path.join(fileDir, 'Folder1.1/same.txt')
readFile(filename)
#For accessing the file in the parent folder of the current folder
filename = os.path.join(fileDir, '../same.txt')
readFile(filename)
#For accessing the file inside a sibling folder.
filename = os.path.join(fileDir, '../Folder2/same.txt')
filename = os.path.abspath(os.path.realpath(filename))
print filename
readFile(filename)

Antwoord 3, autoriteit 13%

Ik heb een account gemaakt zodat ik een discrepantie kan ophelderen die ik denk te hebben gevonden in de oorspronkelijke reactie van Russ.

Ter referentie, zijn oorspronkelijke antwoord was:

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

Dit is een geweldig antwoord omdat het dynamisch probeert een absoluut systeempad naar het gewenste bestand te creëren.

Cory Mawhorter merkte op dat __file__een relatief pad is (het staat ook op mijn systeem) en stelde voor om os.path.abspath(__file__)te gebruiken. os.path.abspathretourneert echter het absolute pad van uw huidige script (d.w.z. /path/to/dir/foobar.py)

Om deze methode te gebruiken (en hoe ik het uiteindelijk heb laten werken), moet je de scriptnaam aan het einde van het pad verwijderen:

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)

Het resulterende abs_file_path (in dit voorbeeld) wordt: /path/to/dir/2091/data.txt


Antwoord 4, autoriteit 9%

Ik besteed veel tijd aan het ontdekken waarom mijn code mijn bestand met Python 3 op het Windows-systeem niet kon vinden. Dus ik voegde toe. voor / en alles werkte prima:

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')

Antwoord 5, autoriteit 9%

Het hangt af van het besturingssysteem dat u gebruikt. Als u een oplossing wilt die compatibel is met zowel Windows als *nix, zoiets als:

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

zou goed moeten werken.

De module pathkan een pad formatteren voor welk besturingssysteem dan ook. Ook behandelt python relatieve paden prima, zolang je de juiste rechten hebt.

Bewerken:

Zoals door Kindall in de opmerkingen vermeld, kan python sowieso converteren tussen Unix-stijl en Windows-stijl paden, dus een nog eenvoudigere code zal werken:

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

Dat gezegd hebbende, de path-moduleheeft nog een aantal handige functies.


Antwoord 6, autoriteit 4%

Probeer dit:

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 introduceerde een nieuwe standaardbibliotheek voor het omgaan met bestanden en paden, genaamd pathlib. Het werkt voor mij!


Antwoord 7, autoriteit 3%

Code:

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

Uitleg:

Bibliotheek importeren:

import os

Gebruik __file__om het pad van het huidige script te bereiken:

script_path = os.path.abspath(__file__)

Scheidt het scriptpad in meerdere items:

path_list = script_path.split(os.sep)

Verwijder het laatste item in de lijst (het eigenlijke scriptbestand):

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

Voeg het pad van het relatieve bestand toe:

rel_path = "main/2091/data.txt

Voeg de lijstitems toe en voeg het relatieve padbestand toe:

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

Nu ben je klaar om te doen wat je wilt met het bestand, zoals bijvoorbeeld:

file = open(path)

Antwoord 8

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.")

Antwoord 9

Python geeft de bestandsnaam die je eraan geeft gewoon door aan het besturingssysteem, dat het opent. Als je besturingssysteem relatieve paden ondersteunt, zoals main/2091/data.txt(hint: dat doet het), dan werkt dat prima.

Misschien vindt u dat de gemakkelijkste manier om een vraag als deze te beantwoorden, is door het te proberen en te kijken wat er gebeurt.


Antwoord 10

Ik weet niet zeker of dit overal werkt.

Ik gebruik ipython in ubuntu.

Als u het bestand in de submap van de huidige map wilt lezen:

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

je script staat in de huidige map
probeer gewoon dit:

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

Antwoord 11

Als het bestand zich in uw bovenliggende map bevindt, bijv. volger.txt, je kunt gewoon open('../follower.txt', 'r').read()

gebruiken


Antwoord 12

Toen ik een beginner was, vond ik deze beschrijvingen een beetje intimiderend. Zoals in het begin zou ik het proberen
For Windows

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

en dit zou een syntax erroropleveren. Ik gebruikte vaak verward raken. Na wat surfen op google. gevonden waarom de fout is opgetreden. Dit schrijven voor beginners

Om het pad in Unicode te kunnen lezen, hoeft u alleen maar een \toe te voegen bij het starten van het bestandspad

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

En nu werkt het, voeg gewoon \toe voordat je de directory start.


Antwoord 13

Krijg het pad van de bovenliggende map en os.jointot het einde van je relatieve bestanden.

# get parent folder with `os.path`
import os.path
BASE_DIR = os.path.dirname(os.path.abspath(__file__))
# get parent folder with `pathlib`'s Path
from pathlib import Path
BASE_DIR = Path(__file__).absolute().parent
# path to files relative to parent
file = "config.yaml"
final_path = os.path.join(BASE_DIR, file)  # os.path
final_path = BASE_DIR / file  # pathlib

Other episodes