__file__ist nicht definiert, wenn Sie Python als interaktive Shell ausführen. Der erste Code in Ihrer Frage sieht aus, als NameErrorstamme er aus einer interaktiven Shell, würde aber tatsächlich eine erzeugen , zumindest unter Python 2.7.3, aber auch andere, denke ich.
import os
os.path.dirname(os.path.abspath(__file__))
Wenn Sie das aktuelle Arbeitsverzeichnis meinen:
import os
os.path.abspath(os.getcwd())
Beachten Sie, dass vorher und nachher filezwei Unterstriche stehen, nicht nur einer.
Beachten Sie auch, dass wenn Sie interaktiv ausgeführt werden oder Code aus einer anderen Datei als einer Datei (z. B. einer Datenbank oder einer Online-Ressource) geladen haben, diese __file__möglicherweise nicht festgelegt wird, da keine Vorstellung von "aktueller Datei" besteht. Die obige Antwort geht von dem häufigsten Szenario aus, in dem ein Python-Skript in einer Datei ausgeführt wird.
abspath () ist obligatorisch, wenn Sie keine seltsamen Verhaltensweisen unter Windows entdecken möchten, bei denen dirname ( file ) möglicherweise eine leere Zeichenfolge zurückgibt !
Sorin
4
sollte os.path.dirname sein (os.path.abspath (os .__ file__))?
DrBailey
5
@ DrBailey: Nein, ActivePython hat nichts Besonderes. __file__(Beachten Sie, dass es zwei Unterstriche auf beiden Seiten des Wortes gibt) ist ein Standardbestandteil von Python. Es ist beispielsweise nicht in C-basierten Modulen verfügbar, sollte jedoch immer in einem Python-Skript verfügbar sein.
Bryan Oakley
10
Ich würde empfehlen, realpath anstelle von abspath zu verwenden, um eine mögliche symbolische Verknüpfung aufzulösen.
TTimo
12
@ cph2117: Dies funktioniert nur, wenn Sie es in einem Skript ausführen. Es gibt keine __file__Möglichkeit, eine interaktive Eingabeaufforderung auszuführen. \
Bryan Oakley
99
Die Verwendung Pathwird seit Python 3 empfohlen:
from pathlib importPathprint("File Path:",Path(__file__).absolute())print("Directory Path:",Path().absolute())
Ich musste tun Path(__file__).parent, um den Ordner zu bekommen, der die Datei enthält
YellowPillow
Das ist richtig @YellowPillow, Path(__file__)holt dir die Datei. .parentSie erhalten eine Ebene über dem enthaltenen Verzeichnis. Sie können weitere hinzufügen .parent, um so viele Verzeichnisse aufzurufen, wie Sie benötigen.
Ron Kalian
1
Es tut mir leid, ich hätte das klarer machen sollen, aber wenn Path().absolute()es in einem Modul unter existiert path/to/moduleund Sie das Modul von einem Skript aus aufrufen, path/to/scriptwürde es path/to/scriptstattpath/to/module
YellowPillow
1
@ YellowPillow Path(__file__).cwd()ist expliziter
Charles
1
Path(__file__)funktioniert nicht immer, zum Beispiel nicht in Jupyter Notebook. Path().absolute()löst dieses Problem.
Ron Kalian
43
In Python 3.x mache ich:
from pathlib importPath
path =Path(__file__).parent.absolute()
Erläuterung:
Path(__file__) ist der Pfad zur aktuellen Datei.
.parentgibt Ihnen das Verzeichnis, in dem sich die Datei befindet.
.absolute()gibt Ihnen den vollen absoluten Weg dorthin.
Verwenden pathlibist die moderne Art, mit Pfaden zu arbeiten. Wenn Sie es später aus irgendeinem Grund als Zeichenfolge benötigen, tun Sie es einfach str(path).
Dies sollte die akzeptierte Antwort ab 2019 sein. Eines könnte auch in der Antwort erwähnt werden: Man kann sofort .open()ein PathObjekt wie inwith Path(__file__).parent.joinpath('some_file.txt').open() as f:
Entschuldigung, aber diese Antwort ist falsch. Die richtige ist die von Bryan `dirname (abspath ( Datei )). Siehe Kommentare für Details.
Sorin
1
Es wird / als Ausgabe geben
Tripathi29
2
@sorin Eigentlich auf Python 3.6 sind beide gleich
DollarAkshay
5
Sie können osund os.pathBibliothek einfach wie folgt verwenden
import os
os.chdir(os.path.dirname(os.getcwd()))
os.path.dirnameGibt das obere Verzeichnis vom aktuellen zurück. Damit können wir zu einer höheren Ebene wechseln, ohne ein Dateiargument zu übergeben und ohne den absoluten Pfad zu kennen.
Dies gibt nicht das Verzeichnis der aktuellen Datei an . Es gibt das Verzeichnis des aktuellen Arbeitsverzeichnisses zurück, das völlig anders sein kann. Was Sie vorschlagen, funktioniert nur, wenn sich die Datei im aktuellen Arbeitsverzeichnis befindet.
Bryan Oakley
4
Versuche dies:
import os
dir_path = os.path.dirname(os.path.realpath(__file__))
from pathlib importPath#Returns the path of the directory, where your script file is placed
mypath =Path().absolute()print('Absolute path : {}'.format(mypath))#if you want to go to any other file inside the subdirectories of the directory path got from above method
filePath = mypath/'data'/'fuel_econ.csv'print('File path : {}'.format(filePath))#To check if file present in that directory or Not
isfileExist = filePath.exists()print('isfileExist : {}'.format(isfileExist))#To check if the path is a directory or a File
isadirectory = filePath.is_dir()print('isadirectory : {}'.format(isadirectory))#To get the extension of the file
fileExtension = mypath/'data'/'fuel_econ.csv'print('File extension : {}'.format(filePath.suffix))
AUSGABE:
ABSOLUTER WEG IST DER WEG, AUF DEM IHRE PYTHON-DATEI platziert wird
Absoluter Pfad: D: \ Study \ Machine Learning \ Jupitor Notebook \ JupytorNotebookTest2 \ Udacity_Scripts \ Matplotlib und Seaborn Part2
Dateipfad: D: \ Study \ Machine Learning \ Jupitor Notebook \ JupytorNotebookTest2 \ Udacity_Scripts \ Matplotlib und Seaborn Part2 \ data \uelce_econ.csv
@Kiro, meine Lösung beantwortet die Frage mit IPython. Wenn zum Beispiel jemand eine Frage mit einer Lösung unter Verwendung einer neuen Bibliothek beantwortet, bleibt sie auch imho eine relevante Antwort auf die Frage.
Nafeez Quraishi
@NafeezQuraishi Ihre Lösung führt eine Bibliothek eines Drittanbieters und eine Klasse ein, aus der Sie instanziieren müssen, um das gewünschte Ergebnis zu erzielen. Ich selbst und ich denke, viele andere versuchen aus mehreren Gründen, die Verwendung externer Bibliotheken zu vermeiden, und ich würde Ihre Lösung nur ausprobieren, wenn nichts anderes funktioniert. Glücklicherweise gibt es eine Reihe integrierter Funktionen, mit denen Sie das gewünschte Ergebnis erzielen können, ohne dass eine externe Bibliothek erforderlich ist.
Elliotwesoff
@ elli0t, stimme teilweise zu. Stellen Sie sich vor, jemand, der Jupyter Notebook verwendet, hat diese Frage, für die die Verwendung des magischen Befehls% pwd möglicherweise einfacher und dem Import von Betriebssystemen vorzuziehen wäre.
Nafeez Quraishi
0
Versuchen Sie Folgendes, um die plattformübergreifende Migrationskonsistenz (macOS / Windows / Linux) zu gewährleisten:
## IMPORT MODULESimport os
## CALCULATE FILEPATH VARIABLE
filepath = os.path.abspath('')## ~ os.getcwd()## TEST TO MAKE SURE os.getcwd() is EQUIVALENT ALWAYS..## ..OR DIFFERENT IN SOME CIRCUMSTANCES
Das aktuelle Arbeitsverzeichnis stimmt möglicherweise nicht mit dem Verzeichnis der aktuellen Datei überein. Ihre Lösung funktioniert nur, wenn das aktuelle Arbeitsverzeichnis mit dem Verzeichnis übereinstimmt, in dem sich die Datei befindet. Das kann während der Entwicklung ziemlich häufig sein, ist aber für ein bereitgestelltes Skript normalerweise ziemlich selten.
Bryan Oakley
Danke für die Information. Ich habe meine Antwort aktualisiert, um die Möglichkeit zu berücksichtigen, dass diese möglicherweise nicht gleichwertig sind und denselben Dateipfad zurückgeben. Dies ist der Grund, warum ich mich an die Philosophie der Codierung halte, die als "inkrementelle Programmierung", Testen und viele print () - Funktionsaufrufe bezeichnet wird, um die Ausgabe zu testen und / oder die Werte bei jedem Schritt des Weges zurückzugeben. Ich hoffe, mein Code spiegelt jetzt besser die Realität von os.path.abspath () vs. os.getcwd () wider, da ich nicht behaupte, alles zu wissen. Sie können jedoch sehen, dass ich os.getcwd () nicht als Hauptlösung in die Kommentare eingefügt habe, sondern als einen alten Code, an den man sich erinnern und den man überprüfen sollte.
Jerusalem Programmer
PS Ich denke, jemand hat den Großteil meiner Antwort, die ich hier gepostet habe, bearbeitet und gelöscht ... :( Dies hält die Leute von der Teilnahme ab, wenn ihre Antworten zensiert und gehackt werden sollen.
Jerusalem Programmer
1
Sie sind die einzige Person, die diese Antwort bearbeitet hat. Außerdem beantworten Ihre Änderungen die Frage immer noch nicht richtig. In der Frage wird speziell nach dem Pfad zum Verzeichnis der Datei gefragt, und in Ihrer Antwort wird nur erwähnt, dass das aktuelle Verzeichnis abgerufen wird. Das ist keine richtige Antwort, da das aktuelle Verzeichnis sehr oft nicht mit dem Verzeichnis übereinstimmt, in dem sich das Skript befindet. Dies hat nichts damit zu tun abspath.
Bryan Oakley
Mit Sicherheit gibt der von mir freigegebene Code den Pfad zum Verzeichnis der Datei an, wenn er aus dem Verzeichnis und / oder der Datei ausgeführt wird, von der aus Sie den absoluten Dateipfad ermitteln möchten. Mit Sicherheit ist es eine richtige Antwort. Bitte sei kein Troll.
__file__
ist nicht definiert, wenn Sie Python als interaktive Shell ausführen. Der erste Code in Ihrer Frage sieht aus, alsNameError
stamme er aus einer interaktiven Shell, würde aber tatsächlich eine erzeugen , zumindest unter Python 2.7.3, aber auch andere, denke ich.Antworten:
Python 3
Für das Verzeichnis des ausgeführten Skripts:
Für das aktuelle Arbeitsverzeichnis:
Python 2 und 3
Für das Verzeichnis des ausgeführten Skripts:
Wenn Sie das aktuelle Arbeitsverzeichnis meinen:
Beachten Sie, dass vorher und nachher
file
zwei Unterstriche stehen, nicht nur einer.Beachten Sie auch, dass wenn Sie interaktiv ausgeführt werden oder Code aus einer anderen Datei als einer Datei (z. B. einer Datenbank oder einer Online-Ressource) geladen haben, diese
__file__
möglicherweise nicht festgelegt wird, da keine Vorstellung von "aktueller Datei" besteht. Die obige Antwort geht von dem häufigsten Szenario aus, in dem ein Python-Skript in einer Datei ausgeführt wird.Verweise
quelle
__file__
(Beachten Sie, dass es zwei Unterstriche auf beiden Seiten des Wortes gibt) ist ein Standardbestandteil von Python. Es ist beispielsweise nicht in C-basierten Modulen verfügbar, sollte jedoch immer in einem Python-Skript verfügbar sein.__file__
Möglichkeit, eine interaktive Eingabeaufforderung auszuführen. \Die Verwendung
Path
wird seit Python 3 empfohlen:Dokumentation: pathlib
Hinweis: Wenn Sie Jupyter Notebook verwenden,
__file__
wird der erwartete Wert nicht zurückgegebenPath().absolute()
und muss verwendet werden.quelle
Path(__file__).parent
, um den Ordner zu bekommen, der die Datei enthältPath(__file__)
holt dir die Datei..parent
Sie erhalten eine Ebene über dem enthaltenen Verzeichnis. Sie können weitere hinzufügen.parent
, um so viele Verzeichnisse aufzurufen, wie Sie benötigen.Path().absolute()
es in einem Modul unter existiertpath/to/module
und Sie das Modul von einem Skript aus aufrufen,path/to/script
würde espath/to/script
stattpath/to/module
Path(__file__).cwd()
ist expliziterPath(__file__)
funktioniert nicht immer, zum Beispiel nicht in Jupyter Notebook.Path().absolute()
löst dieses Problem.In Python 3.x mache ich:
Erläuterung:
Path(__file__)
ist der Pfad zur aktuellen Datei..parent
gibt Ihnen das Verzeichnis, in dem sich die Datei befindet..absolute()
gibt Ihnen den vollen absoluten Weg dorthin.Verwenden
pathlib
ist die moderne Art, mit Pfaden zu arbeiten. Wenn Sie es später aus irgendeinem Grund als Zeichenfolge benötigen, tun Sie es einfachstr(path)
.quelle
.open()
einPath
Objekt wie inwith Path(__file__).parent.joinpath('some_file.txt').open() as f:
quelle
/
als Ausgabe gebenSie können
os
undos.path
Bibliothek einfach wie folgt verwendenos.path.dirname
Gibt das obere Verzeichnis vom aktuellen zurück. Damit können wir zu einer höheren Ebene wechseln, ohne ein Dateiargument zu übergeben und ohne den absoluten Pfad zu kennen.quelle
Versuche dies:
quelle
Ich habe festgestellt, dass die folgenden Befehle alle den vollständigen Pfad des übergeordneten Verzeichnisses eines Python 3.6-Skripts zurückgeben.
Python 3.6-Skript:
Erklärungslinks: .resolve () , .absolute () , Path ( Datei ) .parent (). Absolute ()
quelle
System: MacOS
Version: Python 3.6 mit Anaconda
quelle
NÜTZLICHE PFADEIGENSCHAFTEN IN PYTHON:
AUSGABE: ABSOLUTER WEG IST DER WEG, AUF DEM IHRE PYTHON-DATEI platziert wird
Absoluter Pfad: D: \ Study \ Machine Learning \ Jupitor Notebook \ JupytorNotebookTest2 \ Udacity_Scripts \ Matplotlib und Seaborn Part2
Dateipfad: D: \ Study \ Machine Learning \ Jupitor Notebook \ JupytorNotebookTest2 \ Udacity_Scripts \ Matplotlib und Seaborn Part2 \ data \uelce_econ.csv
isfileExist: Richtig
isadirectory: False
Dateierweiterung: .csv
quelle
Wenn Sie nur das aktuelle Arbeitsverzeichnis anzeigen möchten
Wenn Sie das aktuelle Arbeitsverzeichnis ändern möchten
Pfad ist eine Zeichenfolge, die den erforderlichen Pfad enthält, der verschoben werden soll. z.B
quelle
IPython
hat einen magischen Befehl%pwd
, um das aktuelle Arbeitsverzeichnis abzurufen. Es kann folgendermaßen verwendet werden:Unter IPython kann Jupyter Notebook
%pwd
wie folgt direkt verwendet werden:quelle
Versuchen Sie Folgendes, um die plattformübergreifende Migrationskonsistenz (macOS / Windows / Linux) zu gewährleisten:
quelle
Ich habe eine Funktion erstellt, die beim Ausführen von Python unter IIS in CGI verwendet werden soll, um den aktuellen Ordner abzurufen:
quelle
Angenommen, Sie haben die folgende Verzeichnisstruktur: -
main / fold1 fold2 fold3 ...
quelle
quelle
abspath
.