Wie erhalte ich den vollständigen Pfad des Verzeichnisses der aktuellen Datei?


804

Ich möchte den Verzeichnispfad der aktuellen Datei abrufen. Ich habe es versucht:

>>> os.path.abspath(__file__)
'C:\\python27\\test.py'

Aber wie kann ich den Pfad des Verzeichnisses abrufen?

Zum Beispiel:

'C:\\python27\\'


5
__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.
Drevicko

Antworten:


1634

Python 3

Für das Verzeichnis des ausgeführten Skripts:

import pathlib
pathlib.Path(__file__).parent.absolute()

Für das aktuelle Arbeitsverzeichnis:

import pathlib
pathlib.Path().absolute()

Python 2 und 3

Für das Verzeichnis des ausgeführten Skripts:

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.

Verweise

  1. pathlib in der Python-Dokumentation.
  2. os.path 2.7 , os.path 3.8
  3. os.getcwd 2.7 , os.getcwd 3.8
  4. Was bedeutet / bedeutet die Variable __file__?

43
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 import Path
print("File      Path:", Path(__file__).absolute())
print("Directory Path:", Path().absolute())  

Dokumentation: pathlib

Hinweis: Wenn Sie Jupyter Notebook verwenden, __file__wird der erwartete Wert nicht zurückgegeben Path().absolute()und muss verwendet werden.


17
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 import Path

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


3
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:
stefanct

9
import os
print os.path.dirname(__file__)

21
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.


7
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


2

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:

#!/usr/bin/env python3.6
# -*- coding: utf-8 -*-

from pathlib import Path

#Get the absolute path of a Python3.6 script
dir1 = Path().resolve()  #Make the path absolute, resolving any symlinks.
dir2 = Path().absolute() #See @RonKalian answer 
dir3 = Path(__file__).parent.absolute() #See @Arminius answer 

print(f'dir1={dir1}\ndir2={dir2}\ndir3={dir3}')

Erklärungslinks: .resolve () , .absolute () , Path ( Datei ) .parent (). Absolute ()


2

System: MacOS

Version: Python 3.6 mit Anaconda

import os

rootpath = os.getcwd()

os.chdir(rootpath)

1

NÜTZLICHE PFADEIGENSCHAFTEN IN PYTHON:

 from pathlib import Path

    #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

isfileExist: Richtig

isadirectory: False

Dateierweiterung: .csv


1

Wenn Sie nur das aktuelle Arbeitsverzeichnis anzeigen möchten

import os
print(os.getcwd)

Wenn Sie das aktuelle Arbeitsverzeichnis ändern möchten

os.chdir(path)

Pfad ist eine Zeichenfolge, die den erforderlichen Pfad enthält, der verschoben werden soll. z.B

path = "C:\\Users\\xyz\\Desktop\\move here"

0

IPythonhat einen magischen Befehl %pwd, um das aktuelle Arbeitsverzeichnis abzurufen. Es kann folgendermaßen verwendet werden:

from IPython.terminal.embed import InteractiveShellEmbed

ip_shell = InteractiveShellEmbed()

present_working_directory = ip_shell.magic("%pwd")

Unter IPython kann Jupyter Notebook %pwdwie folgt direkt verwendet werden:

present_working_directory = %pwd

5
Die Frage ist nicht über IPython
Kiro

1
@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:

path = r'%s' % os.getcwd().replace('\\','/')

0

Ich habe eine Funktion erstellt, die beim Ausführen von Python unter IIS in CGI verwendet werden soll, um den aktuellen Ordner abzurufen:

import os 
   def getLocalFolder():
        path=str(os.path.dirname(os.path.abspath(__file__))).split('\\')
        return path[len(path)-1]

0

Angenommen, Sie haben die folgende Verzeichnisstruktur: -

main / fold1 fold2 fold3 ...

folders = glob.glob("main/fold*")

for fold in folders:
    abspath = os.path.dirname(os.path.abspath(fold))
    fullpath = os.path.join(abspath, sch)
    print(fullpath)

-1
## IMPORT MODULES
import os

## CALCULATE FILEPATH VARIABLE
filepath = os.path.abspath('') ## ~ os.getcwd()
## TEST TO MAKE SURE os.getcwd() is EQUIVALENT ALWAYS..
## ..OR DIFFERENT IN SOME CIRCUMSTANCES

2
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.
Jerusalem Programmer
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.