Jak uzyskać pełną ścieżkę do katalogu bieżącego pliku?


799

Chcę uzyskać ścieżkę do katalogu bieżącego pliku. Próbowałem:

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

Ale jak mogę pobrać ścieżkę do katalogu?

Na przykład:

'C:\\python27\\'


5
__file__nie jest zdefiniowany po uruchomieniu Pythona jako interaktywnej powłoki. Pierwszy fragment kodu w twoim pytaniu wygląda na to, że pochodzi on z interaktywnej powłoki, ale faktycznie wygenerowałby NameError, przynajmniej na Pythonie 2.7.3, ale inne też chyba.
drevicko

Odpowiedzi:


1628

Python 3

Dla katalogu uruchamianego skryptu:

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

Dla bieżącego katalogu roboczego:

import pathlib
pathlib.Path().absolute()

Python 2 i 3

Dla katalogu uruchamianego skryptu:

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

Jeśli masz na myśli bieżący katalog roboczy:

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

Pamiętaj, że przed i po filesą dwa podkreślenia, a nie tylko jeden.

Pamiętaj również, że jeśli działasz interaktywnie lub załadowałeś kod z czegoś innego niż plik (np. Baza danych lub zasób online), __file__może nie zostać ustawiony, ponieważ nie ma pojęcia „bieżący plik”. Powyższa odpowiedź zakłada najczęstszy scenariusz uruchamiania skryptu python, który znajduje się w pliku.

Bibliografia

  1. ścieżka w dokumentacji Pythona.
  2. os.path 2.7 , os.path 3.8
  3. os.getcwd 2.7 , os.getcwd 3.8
  4. co oznacza zmienna __file__ / oznacza?

43
abspath () jest obowiązkowa, jeśli nie chcesz odkrywać dziwnych zachowań w systemie Windows, gdzie nazwa_katalogu ( plik ) może zwrócić pusty ciąg!
sorin,

4
powinno być os.path.dirname (os.path.abspath (os .__ plik__))?
DrBailey

5
@DrBailey: nie, w ActivePython nie ma nic specjalnego. __file__(zauważ, że są to dwa znaki podkreślenia po obu stronach słowa) to standardowa część Pythona. Na przykład nie jest dostępny w modułach opartych na języku C, ale zawsze powinien być dostępny w skrypcie python.
Bryan Oakley,

10
Polecam użycie realpath zamiast abspath, aby rozwiązać ewentualne dowiązanie symboliczne.
TTimo,

12
@ cph2117: zadziała to tylko wtedy, gdy uruchomisz go w skrypcie. Nie ma, __file__jeśli działa z interaktywnego monitu. \
Bryan Oakley,

99

Używanie Pathjest zalecanym sposobem od Python 3:

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

Dokumentacja: pathlib

Uwaga: Jeśli używasz Jupyter Notebook, __file__nie zwraca oczekiwanej wartości, więc Path().absolute()należy go użyć.


17
Musiałem zrobić, Path(__file__).parentaby uzyskać folder zawierający plik
YellowPillow

To prawda @YellowPillow, Path(__file__)dostaje plik. .parentprzenosi cię o jeden poziom wyżej, tj. zawierający katalog Możesz dodać .parentdo tego więcej , aby przejść o tyle katalogów, ile potrzebujesz.
Ron Kalian

1
Przepraszam, że powinienem był to wyjaśnić, ale jeśli Path().absolute()istnieje w jakimś module znajdującym się na, path/to/modulea ty wywołujesz moduł z jakiegoś skryptu znajdującego się w, path/to/scriptwtedy wróciłby path/to/scriptzamiastpath/to/module
YellowPillow

1
@YellowPillow Path(__file__).cwd()jest bardziej jednoznaczny
Charles

1
Path(__file__)nie zawsze działa, na przykład nie działa w Jupyter Notebook. Path().absolute()rozwiązuje ten problem.
Ron Kalian

43

W Pythonie 3.x robię:

from pathlib import Path

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

Wyjaśnienie:

  • Path(__file__) jest ścieżką do bieżącego pliku.
  • .parentdaje katalog, w którym znajduje się plik.
  • .absolute()daje pełną ścieżkę bezwzględną do tego.

Korzystanie pathlibto nowoczesny sposób pracy ze ścieżkami. Jeśli z jakiegoś powodu potrzebujesz go jako ciągu, po prostu zrób to str(path).


3
Powinno to być odpowiedź akceptowana jako z 2019 roku jedna rzecz może być mowa w odpowiedzi, a także: można natychmiast zadzwonić .open()na takim Pathobiekcie jak wwith Path(__file__).parent.joinpath('some_file.txt').open() as f:
stefanct

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

21
Przepraszamy, ale ta odpowiedź jest niepoprawna, poprawna jest odpowiedź dirname Bryana (abspath ( plik )). Zobacz komentarze, aby uzyskać szczegółowe informacje.
sorin,

1
To daje / na wyjściu
Tripathi29

2
@sorin Właściwie w Pythonie 3.6 oba są takie same
DollarAkshay

5

Możesz łatwo używać osi os.pathbiblioteki w następujący sposób

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

os.path.dirnamezwraca górny katalog z bieżącego. Pozwala nam przejść na wyższy poziom bez przekazywania argumentów pliku i bez znajomości bezwzględnej ścieżki.


7
Nie daje to katalogu bieżącego pliku . Zwraca katalog bieżącego katalogu roboczego, który może być zupełnie inny. Sugerowane działanie działa tylko wtedy, gdy plik znajduje się w bieżącym katalogu roboczym.
Bryan Oakley


2

Odkryłem, że następujące polecenia zwrócą pełną ścieżkę katalogu nadrzędnego skryptu Python 3.6.

Skrypt 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}')

Objaśnienia: .resolve () , .absolute () , ścieżka ( plik ) .parent (). Bezwzględny ()


2

System: MacOS

Wersja: Python 3.6 w / Anaconda

import os

rootpath = os.getcwd()

os.chdir(rootpath)

1

PRZYDATNE WŁAŚCIWOŚCI ŚCIEŻKI W 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))

WYDAJNOŚĆ: ŚCIEŻKA ABSOLUTNA JEST ŚCIEŻKĄ GDZIE UMIESZCZONY JEST PLIK PYTHON

Ścieżka bezwzględna: D: \ Study \ Machine Learning \ Jupitor Notebook \ JupytorNotebookTest2 \ Udacity_Scripts \ Matplotlib and seaborn Part2

Ścieżka pliku: D: \ Study \ Machine Learning \ Jupitor Notebook \ JupytorNotebookTest2 \ Udacity_Scripts \ Matplotlib and seaborn Part2 \ data \ fuel_econ.csv

isfileExist: True

isadirectory: False

Rozszerzenie pliku: .csv


1

Jeśli chcesz tylko zobaczyć bieżący katalog roboczy

import os
print(os.getcwd)

Jeśli chcesz zmienić bieżący katalog roboczy

os.chdir(path)

ścieżka jest ciągiem zawierającym wymaganą ścieżkę do przeniesienia. na przykład

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

0

IPythonma magiczne polecenie, %pwdaby uzyskać obecny katalog roboczy. Można go użyć w następujący sposób:

from IPython.terminal.embed import InteractiveShellEmbed

ip_shell = InteractiveShellEmbed()

present_working_directory = ip_shell.magic("%pwd")

Na IPython Jupyter Notebook %pwdmoże być używany bezpośrednio w następujący sposób:

present_working_directory = %pwd

5
Pytanie nie dotyczy IPython
Kiro

1
@Kiro, moje rozwiązanie odpowiada na pytanie za pomocą IPython. Na przykład, jeśli ktoś odpowie na pytanie za pomocą rozwiązania wykorzystującego nową bibliotekę, to również imho pozostaje odpowiednią odpowiedzią na pytanie.
Nafeez Quraishi

@NafeezQuraishi Twoje rozwiązanie wprowadza bibliotekę strony trzeciej oraz klasę, z której musisz utworzyć instancję, aby osiągnąć pożądany rezultat. Ja i myślę, że wielu innych próbuje unikać korzystania z bibliotek zewnętrznych z wielu powodów, a ja wypróbowałbym twoje rozwiązanie, tylko jeśli nic innego nie zadziałałoby. Na szczęście istnieje szereg wbudowanych funkcji, których można użyć do uzyskania pożądanego rezultatu bez potrzeby korzystania z zewnętrznej biblioteki.
elliotwesoff

@ elli0t, częściowo się zgadzam. Zastanów się, czy ktoś korzystający z notatnika Jupyter ma to pytanie, dla kogo użycie komendy% pwd magic byłoby łatwiejsze i lepsze niż importowanie systemu operacyjnego.
Nafeez Quraishi,

0

Aby zachować spójność migracji na różnych platformach (macOS / Windows / Linux), spróbuj:

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

0

Stworzyłem funkcję, która ma być używana podczas uruchamiania Pythona w IIS w CGI, aby uzyskać bieżący folder:

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

0

Załóżmy, że masz następującą strukturę katalogów: -

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
Bieżący katalog roboczy może nie być taki sam jak katalog bieżącego pliku. Twoje rozwiązanie będzie działać tylko wtedy, gdy bieżący katalog roboczy jest taki sam jak katalog, w którym znajduje się plik. Może to być dość powszechne podczas programowania, ale zwykle jest dość rzadkie w przypadku wdrożonego skryptu.
Bryan Oakley,

Dzięki za informację. Zaktualizowałem swoją odpowiedź, aby uwzględnić możliwość, że zwracanie tej samej ścieżki pliku może nie być równoważne. Właśnie dlatego stosuję filozofię kodowania zwaną „programowaniem przyrostowym”, testowaniem i mnóstwem wywołań funkcji print () w celu testowania wyników i / lub wartości zwracanych na każdym etapie. Mam nadzieję, że mój kod lepiej odzwierciedla teraz rzeczywistość os.path.abspath () vs. os.getcwd (), ponieważ nie twierdzę, że wszystko wiem. Widać jednak, że umieszczam os.getcwd () w komentarzach jako nie główne rozwiązanie, ale raczej jako alternatywny fragment kodu, który warto zapamiętać i sprawdzić.
Programista Jeruzalem

PS Wydaje mi się, że ktoś edytował i usunął większość mojej odpowiedzi, którą tu opublikowałem ... :( Takie zniechęca ludzi do uczestnictwa, jeśli ich odpowiedzi zostaną ocenzurowane i posiekane.
Programista z Jerozolimy

1
Jesteś jedyną osobą, która edytowała tę odpowiedź. Ponadto wprowadzone zmiany nadal nie odpowiadają poprawnie na pytanie. Pytanie dotyczy konkretnie ścieżki do katalogu pliku, a twoja odpowiedź wspomina tylko o pobraniu bieżącego katalogu. To nie jest poprawna odpowiedź, ponieważ bieżący katalog często nie jest taki sam jak katalog, w którym znajduje się skrypt. Nie ma to nic wspólnego abspath.
Bryan Oakley

Z pewnością udostępniony przeze mnie kod podaje ścieżkę do katalogu pliku, jeśli jest uruchamiany z katalogu i / lub pliku, z którego chcesz poznać bezwzględną ścieżkę do pliku. Z pewnością jest to poprawna odpowiedź. Proszę, nie bądź trollem.
Programista Jerozolimski,
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.