Relative Datei-System-Pfade ?

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
mephisto-online
User
Beiträge: 167
Registriert: Sonntag 29. September 2013, 17:05

Hallo,

vielleicht eine zu einfache Frage, aber ich finde einfach nichts Brauchbares!

Problem:
In meinem Python Programm möchte ich gerne Files aus Unterverzeichnissen meines Programms lesen. Hierfür möchte ich Konstanten an einen QFileDialog().getOpenFileName(...) mit "directory=KONSTANTE_XYZ" übergeben.

Mit absoluten Pfaden funktioniert das, :)
ohne Pfad-Angabe lande ich im Programm-Verzeichnis (logisch !). 8)
Wenn ich aber z.B. directory='./daten' übergebe, klappt das nicht und ich lande trotzdem im "Arbeits-Verzeichnis". :(

Wie definiert man in Python relative Pfadangaben ?

Viele Grüße
mephisto-online
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

An den Pfad deines Moduls kommst du mittels ``__file__``. Das ist global verfügbar.
Das Leben ist wie ein Tennisball.
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

Genauer gesagt: Jedes Modul hat ein eigenes `__file__` das den Dateipfad des Moduls enthaelt. Mittels `modul.__file__` kann man dann noch auf andere Module zugreifen.
mephisto-online
User
Beiträge: 167
Registriert: Sonntag 29. September 2013, 17:05

Das hatte ich eigentlich auch so gelesen. Aber:

Code: Alles auswählen

print(self.__file__)
sagt mir '__main__', weil main.py. Nicht den Pfad ! :(
Sirius3
User
Beiträge: 17746
Registriert: Sonntag 21. Oktober 2012, 17:20

@mephisto-online: mir sagt Python, dass er »self« nicht kennt.
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

Die einzige Stelle bei der man "__main__" erwarten kann, ist das `__name__` des "Startskriptes".
Wie du auf die Erklaerung kommst, dass es "__main__" ist, weil die Datei "main.py" heisst ist mir schleierhaft ... ich sehe da zumindest erhebliche Unterschiede zwischen den beiden Namen.

Und falls Sirius' Antwort zu subtil ist: Solange `self` nicht der Name eines Moduls ist, bist du fehl am Platz. Der Name ist `__file__`.
mephisto-online
User
Beiträge: 167
Registriert: Sonntag 29. September 2013, 17:05

Ja sorry, hatte mich mal wieder selbst gefoppt ... :oops:

self.__file__ gibt es natürlich nicht !

Aber __file__ :

Code: Alles auswählen

JAVA_DAT_DIR = './Daten' # ????
...

class MainWindow(QtGui.QMainWindow):

    def __init__(self):
        super(MainWindow, self).__init__()
        ...

    def import(self):

        file_dialog = QFileDialog()
        file_name = file_dialog.getOpenFileName(self,
                                                caption='Import ajd ...',
                                                directory=JAVA_DAT_DIR
                                                filter='Java Daten (*.jdf)')
        ...

def main():
    app = QtGui.QApplication(sys.argv)

    print(__file__) # Liefert Python-Filename mit vollständigem Pfad

    ex = MainWindow()
    sys.exit(app.exec_())

if __name__ == '__main__':
    main()
Liefert Filenamen mit Pfad. Muss ich den jetzt "splitten", den Python-Filenamen entfernen und dann meinen Java-Daten-Verzeichnisnamen anfügen ? Oder geht das auch " eleganter ? (Eigentlich ist Python ja schon "elegant" genug ! :lol: )

Aber wie komme ich in MainWindow() da dran ? Parameter ?

Code: Alles auswählen

 ...
ex = MainWindow(file_path)
...
Benutzeravatar
diesch
User
Beiträge: 80
Registriert: Dienstag 14. April 2009, 13:36
Wohnort: Brandenburg a.d. Havel
Kontaktdaten:

mephisto-online hat geschrieben: Liefert Filenamen mit Pfad. Muss ich den jetzt "splitten", den Python-Filenamen entfernen und dann meinen Java-Daten-Verzeichnisnamen anfügen ? Oder geht das auch " eleganter ? (Eigentlich ist Python ja schon "elegant" genug ! :lol: )

Code: Alles auswählen

os.path.abspath(os.path.join(os.path.dirname(__file__), JAVA_DAT_DIR))
http://www.florian-diesch.de
mephisto-online
User
Beiträge: 167
Registriert: Sonntag 29. September 2013, 17:05

Das sieht viel "eleganter" aus ! :D

Mein Vorschlag ist da mehr "gebastelt" :oops:

Thanks !!
Antworten