Hoe importeer je bestanden in python met sys.path.append?

Er zijn twee mappen op mijn bureaublad, DIR1en DIR2die de volgende bestanden bevatten:

DIR1:
file1.py
DIR2:
file2.py  myfile.txt

De bestanden bevatten het volgende:

bestand1.py

import sys
sys.path.append('.')
sys.path.append('../DIR2')
import file2

file2.py

import sys
sys.path.append( '.' )
sys.path.append( '../DIR2' )
MY_FILE = "myfile.txt"
myfile = open(MY_FILE) 

mijnbestand.txt

some text

Er zijn nu twee scenario’s. De eerste werkt, de tweede geeft een foutmelding.

Scenario 1

Ik cdin DIR2en voer file2.pyuit en het werkt zonder problemen.

Scenario 2

Ik cdin DIR1en voer file1.pyuit en het geeft een foutmelding:

Traceback (most recent call last):
  File "<absolute-path>/DIR1/file1.py", line 6, in <module>
    import file2
  File "../DIR2/file2.py", line 9, in <module>
    myfile = open(MY_FILE)
IOError: [Errno 2] No such file or directory: 'myfile.txt'

Voor mij slaat dit echter nergens op, aangezien ik het pad naar file1.pyheb toegevoegd met het commando sys.path.append('../DIR2').

Waarom gebeurt dit wanneer file1.py, wanneer file2.pyzich in dezelfde map bevindt als myfile.txten toch een fout? Bedankt.


Antwoord 1, autoriteit 100%

Je kunt een pad maken ten opzichte van een module door het __file__-attribuut van een module te gebruiken. Bijvoorbeeld:

myfile = open(os.path.join(
    os.path.dirname(__file__),
    MY_FILE))

Dit zou moeten doen wat je wilt, ongeacht waar je je script begint.


Antwoord 2, autoriteit 13%

Vervang

MY_FILE = "myfile.txt"
myfile = open(MY_FILE) 

met

MY_FILE = os.path.join("DIR2", "myfile.txt")
myfile = open(MY_FILE) 

Dat is waar de opmerkingen in uw vraag naar verwijzen als de relatieve padoplossing. Dit veronderstelt dat je het uitvoert vanuit de dir-map van myfile.txt… dus niet ideaal.

Als je weet dat my_file.txt altijd in dezelfde map zal staan als file2.py, dan kun je zoiets proberen in file2..

from os import path
fname =  path.abspath(path.join(path.dirname(__file__), "my_file.txt"))
myfile = open(fname)

Other episodes