Come posso ottenere il percorso completo della directory del file corrente?


805

Voglio ottenere il percorso della directory del file corrente. Provai:

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

Ma come posso recuperare il percorso della directory?

Per esempio:

'C:\\python27\\'


5
__file__non è definito quando si esegue python come shell interattiva. Il primo pezzo di codice nella tua domanda sembra provenire da una shell interattiva, ma in realtà produrrebbe un NameError, almeno su Python 2.7.3, ma immagino anche altri.
drevicko,

Risposte:


1636

Python 3

Per la directory dello script in esecuzione:

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

Per la directory di lavoro corrente:

import pathlib
pathlib.Path().absolute()

Python 2 e 3

Per la directory dello script in esecuzione:

import os
os.path.dirname(os.path.abspath(__file__))

Se intendi l'attuale directory di lavoro:

import os
os.path.abspath(os.getcwd())

Si noti che prima e dopo filesono due caratteri di sottolineatura, non solo uno.

Si noti inoltre che se si esegue in modo interattivo o si è caricato il codice da qualcosa di diverso da un file (ad esempio: un database o una risorsa online), __file__potrebbe non essere impostato poiché non esiste alcuna nozione di "file corrente". La risposta sopra presuppone lo scenario più comune di esecuzione di uno script Python che si trova in un file.

Riferimenti

  1. pathlib nella documentazione di Python.
  2. os.path 2.7 , os.path 3.8
  3. os.getcwd 2.7 , os.getcwd 3.8
  4. cosa significa / fa la variabile __file__?

43
abspath () è obbligatorio se non vuoi scoprire comportamenti strani su Windows, dove dirname ( file ) può restituire una stringa vuota!
sorin,

4
dovrebbe essere os.path.dirname (os.path.abspath (os .__ file__))?
DrBailey,

5
@DrBailey: no, non c'è niente di speciale in ActivePython. __file__(nota che sono due caratteri di sottolineatura su entrambi i lati della parola) è una parte standard di Python. Non è disponibile nei moduli basati su C, ad esempio, ma dovrebbe sempre essere disponibile in uno script Python.
Bryan Oakley,

10
Consiglierei di usare realpath invece di abspath per risolvere un possibile collegamento simbolico.
TTimo

12
@ cph2117: funzionerà solo se lo esegui in uno script. Non c'è __file__se in esecuzione da un prompt interattivo. \
Bryan Oakley l'

99

L'utilizzo Pathè il modo consigliato da Python 3:

from pathlib import Path
print("File      Path:", Path(__file__).absolute())
print("Directory Path:", Path().absolute())  

Documentazione: pathlib

Nota: se si utilizza Jupyter Notebook, __file__non restituisce il valore previsto, quindi Path().absolute()deve essere utilizzato.


17
Ho dovuto fare Path(__file__).parentper ottenere la cartella che contiene il file
YellowPillow

È corretto @YellowPillow, Path(__file__)ti dà il file. .parentti porta al di sopra di un livello, ovvero la directory contenente. Puoi aggiungerne di più .parentper salire su tutte le directory di cui hai bisogno.
Ron Kalian,

1
Mi dispiace che avrei dovuto renderlo più chiaro, ma se Path().absolute()esiste in alcuni moduli situati in path/to/modulee stai chiamando il modulo da alcuni script situati in path/to/scriptallora ritornerebbe path/to/scriptinvece dipath/to/module
YellowPillow

1
@YellowPillow Path(__file__).cwd()è più esplicito
Charles

1
Path(__file__)non sempre funziona, ad esempio, non funziona in Jupyter Notebook. Path().absolute()risolve quel problema.
Ron Kalian,

43

In Python 3.x faccio:

from pathlib import Path

path = Path(__file__).parent.absolute()

Spiegazione:

  • Path(__file__) è il percorso del file corrente.
  • .parentti dà la directory in cui si trova il file.
  • .absolute()ti dà il percorso completo assoluto ad esso.

L'utilizzo pathlibè il modo moderno di lavorare con i percorsi. Se ne hai bisogno come stringa in seguito per qualche motivo, fallo str(path).


3
Questa dovrebbe essere la risposta accettata a partire dal 2019. Una cosa potrebbe essere menzionata anche nella risposta: si può immediatamente chiamare .open()un Pathoggetto come inwith Path(__file__).parent.joinpath('some_file.txt').open() as f:
stefanct,

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

21
Ci dispiace ma questa risposta non è corretta, quella corretta è quella fatta da Bryan `dirname (abspath ( file )). Vedi i commenti per i dettagli.
sorin,

1
Esso darà / in output
Tripathi29

2
@sorin In realtà su Python 3.6 sono entrambi uguali
DollarAkshay

5

È possibile utilizzare ose la os.pathlibreria facilmente come segue

import os
os.chdir(os.path.dirname(os.getcwd()))

os.path.dirnamerestituisce la directory superiore da quella corrente. Ci consente di passare a un livello superiore senza passare alcun argomento sul file e senza conoscere il percorso assoluto.


7
Questo non fornisce la directory del file corrente . Restituisce la directory della directory di lavoro corrente che potrebbe essere completamente diversa. Quello che suggerisci funziona solo se il file si trova nella directory di lavoro corrente.
Bryan Oakley,


2

Ho scoperto che i seguenti comandi restituiranno tutti il ​​percorso completo della directory principale di uno script Python 3.6.

Script Python 3.6:

#!/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}')

Link esplicativi: .resolve () , .absolute () , Path ( file ) .parent (). Absolute ()


2

Sistema: MacOS

Versione: Python 3.6 con Anaconda

import os

rootpath = os.getcwd()

os.chdir(rootpath)

1

PROPRIETÀ DEL PERCORSO UTILI 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))

PRODUZIONE: IL PERCORSO ASSOLUTO È IL PERCORSO IN CUI È POSIZIONATO IL FILE DI PYTHON

Percorso assoluto: D: \ Study \ Machine Learning \ Jupitor Notebook \ JupytorNotebookTest2 \ Udacity_Scripts \ Matplotlib and seaborn Part2

Percorso file: D: \ Study \ Machine Learning \ Jupitor Notebook \ JupytorNotebookTest2 \ Udacity_Scripts \ Matplotlib and seaborn Part2 \ data \ fuel_econ.csv

isfileExist: True

isadirectory: False

Estensione file: .csv


1

Se vuoi solo vedere la directory di lavoro corrente

import os
print(os.getcwd)

Se si desidera modificare la directory di lavoro corrente

os.chdir(path)

path è una stringa contenente il percorso richiesto da spostare. per esempio

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

0

IPythonha un comando magico %pwdper ottenere l'attuale directory di lavoro. Può essere utilizzato nel modo seguente:

from IPython.terminal.embed import InteractiveShellEmbed

ip_shell = InteractiveShellEmbed()

present_working_directory = ip_shell.magic("%pwd")

Su IPython Jupyter Notebook %pwdpuò essere utilizzato direttamente come segue:

present_working_directory = %pwd

5
La domanda non riguarda IPython
Kiro,

1
@Kiro, la mia soluzione risponde alla domanda utilizzando IPython. Ad esempio, se qualcuno risponde a una domanda con una soluzione utilizzando una nuova libreria, allora rimane anche una risposta pertinente alla domanda.
Nafeez Quraishi,

@NafeezQuraishi la tua soluzione introduce una libreria di terze parti e una classe da cui devi creare un'istanza per ottenere il risultato desiderato. Io stesso e penso che molti altri cerchino di evitare l'uso di librerie esterne per una serie di motivi, e proverei la tua soluzione solo se nient'altro funzionasse. Fortunatamente, esiste una serie di funzioni integrate che è possibile utilizzare per ottenere il risultato desiderato e senza la necessità di una libreria esterna.
elliotwesoff,

@ elli0t, parzialmente d'accordo. Considera qualcuno che usa Jupyter notebook ha questa domanda per chi forse usando il comando% pwd magic sarebbe più facile e preferibile all'importazione os.
Nafeez Quraishi,

0

Per mantenere la coerenza della migrazione su più piattaforme (macOS / Windows / Linux), prova:

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

0

Ho creato una funzione da utilizzare quando eseguo python in IIS in CGI per ottenere la cartella corrente:

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

0

Supponiamo che tu abbia la seguente struttura di directory: -

principale / piega1 piega2 piega3 ...

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
La directory di lavoro corrente potrebbe non essere la stessa della directory del file corrente. La soluzione funzionerà solo se la directory di lavoro corrente è la stessa della directory che contiene il file. Questo può essere abbastanza comune durante lo sviluppo, ma di solito è piuttosto raro per uno script distribuito.
Bryan Oakley,

Grazie per le informazioni. Ho aggiornato la mia risposta per riflettere la possibilità che questi potrebbero non essere equivalenti a restituire lo stesso percorso file. Questo è il motivo per cui aderisco alla filosofia del codice chiamato "programmazione incrementale", test e molte chiamate di funzione print () per testare l'output e / o i valori restituiti in ogni fase del processo. Spero che il mio codice ora rifletta meglio la realtà di os.path.abspath () rispetto a os.getcwd () poiché non pretendo di sapere tutto. Tuttavia puoi vedere che ho inserito os.getcwd () nei commenti non come la soluzione principale, ma piuttosto come un pezzo di codice alternativo che vale la pena ricordare e controllare.
Programmatore di Gerusalemme,

PS Penso che qualcuno abbia modificato e cancellato la maggior parte della mia risposta che ho pubblicato qui ... :( Tali scoraggia le persone dalla partecipazione se le loro risposte verranno censurate e tritate.
Programmatore di Gerusalemme,

1
Sei l'unica persona ad aver modificato questa risposta. Inoltre, le tue modifiche non rispondono correttamente alla domanda. La domanda è in particolare quella relativa al percorso della directory del file e la tua risposta menziona solo come ottenere la directory corrente. Questa non è una risposta corretta, poiché la directory corrente molto spesso non è la stessa della directory in cui si trova lo script. Non ha nulla a che fare con abspath.
Bryan Oakley,

Sicuramente il codice che ho condiviso dà il percorso alla directory del file se eseguito dalla directory e / o dal file da cui si desidera conoscere il percorso assoluto del file. Sicuramente è una risposta corretta. Per favore, non essere un troll.
Programmatore di Gerusalemme
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.