__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.
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.
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 importPathprint("File Path:",Path(__file__).absolute())print("Directory Path:",Path().absolute())
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 importPath
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).
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:
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.
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
4
Spróbuj tego:
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))
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
@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:
## 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
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.
__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łbyNameError
, przynajmniej na Pythonie 2.7.3, ale inne też chyba.Odpowiedzi:
Python 3
Dla katalogu uruchamianego skryptu:
Dla bieżącego katalogu roboczego:
Python 2 i 3
Dla katalogu uruchamianego skryptu:
Jeśli masz na myśli bieżący katalog roboczy:
Pamiętaj, że przed i po
file
są 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
źródło
__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.__file__
jeśli działa z interaktywnego monitu. \Używanie
Path
jest zalecanym sposobem od Python 3:Dokumentacja: pathlib
Uwaga: Jeśli używasz Jupyter Notebook,
__file__
nie zwraca oczekiwanej wartości, więcPath().absolute()
należy go użyć.źródło
Path(__file__).parent
aby uzyskać folder zawierający plikPath(__file__)
dostaje plik..parent
przenosi cię o jeden poziom wyżej, tj. zawierający katalog Możesz dodać.parent
do tego więcej , aby przejść o tyle katalogów, ile potrzebujesz.Path().absolute()
istnieje w jakimś module znajdującym się na,path/to/module
a ty wywołujesz moduł z jakiegoś skryptu znajdującego się w,path/to/script
wtedy wróciłbypath/to/script
zamiastpath/to/module
Path(__file__).cwd()
jest bardziej jednoznacznyPath(__file__)
nie zawsze działa, na przykład nie działa w Jupyter Notebook.Path().absolute()
rozwiązuje ten problem.W Pythonie 3.x robię:
Wyjaśnienie:
Path(__file__)
jest ścieżką do bieżącego pliku..parent
daje katalog, w którym znajduje się plik..absolute()
daje pełną ścieżkę bezwzględną do tego.Korzystanie
pathlib
to nowoczesny sposób pracy ze ścieżkami. Jeśli z jakiegoś powodu potrzebujesz go jako ciągu, po prostu zrób tostr(path)
.źródło
.open()
na takimPath
obiekcie jak wwith Path(__file__).parent.joinpath('some_file.txt').open() as f:
źródło
/
na wyjściuMożesz łatwo używać
os
ios.path
biblioteki w następujący sposóbos.path.dirname
zwraca 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.źródło
Spróbuj tego:
źródło
Odkryłem, że następujące polecenia zwrócą pełną ścieżkę katalogu nadrzędnego skryptu Python 3.6.
Skrypt Python 3.6:
Objaśnienia: .resolve () , .absolute () , ścieżka ( plik ) .parent (). Bezwzględny ()
źródło
System: MacOS
Wersja: Python 3.6 w / Anaconda
źródło
PRZYDATNE WŁAŚCIWOŚCI ŚCIEŻKI W PYTHON:
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
źródło
Jeśli chcesz tylko zobaczyć bieżący katalog roboczy
Jeśli chcesz zmienić bieżący katalog roboczy
ścieżka jest ciągiem zawierającym wymaganą ścieżkę do przeniesienia. na przykład
źródło
IPython
ma magiczne polecenie,%pwd
aby uzyskać obecny katalog roboczy. Można go użyć w następujący sposób:Na IPython Jupyter Notebook
%pwd
może być używany bezpośrednio w następujący sposób:źródło
Aby zachować spójność migracji na różnych platformach (macOS / Windows / Linux), spróbuj:
źródło
Stworzyłem funkcję, która ma być używana podczas uruchamiania Pythona w IIS w CGI, aby uzyskać bieżący folder:
źródło
Załóżmy, że masz następującą strukturę katalogów: -
main / fold1 fold2 fold3 ...
źródło
źródło
abspath
.