__file__tidak didefinisikan ketika Anda menjalankan python sebagai shell interaktif. Sepotong kode pertama dalam pertanyaan Anda sepertinya berasal dari shell interaktif, tetapi sebenarnya akan menghasilkan NameError, setidaknya dengan python 2.7.3, tetapi yang lain juga saya kira.
import os
os.path.dirname(os.path.abspath(__file__))
Jika Anda maksud direktori kerja saat ini:
import os
os.path.abspath(os.getcwd())
Perhatikan bahwa sebelum dan sesudah fileadalah dua garis bawah, bukan hanya satu.
Juga perhatikan bahwa jika Anda menjalankan secara interaktif atau telah memuat kode dari sesuatu selain file (misalnya: database atau sumber daya online), __file__mungkin tidak diatur karena tidak ada gagasan "file saat ini". Jawaban di atas mengasumsikan skenario paling umum menjalankan skrip python yang ada dalam file.
abspath () wajib jika Anda tidak ingin menemukan perilaku aneh di windows, di mana dirname ( file ) dapat mengembalikan string kosong!
sorin
4
harus berupa os.path.dirname (os.path.abspath (os .__ file__))?
DrBailey
5
@DrBailey: tidak, tidak ada yang spesial tentang ActivePython. __file__(perhatikan bahwa dua garis bawah pada kedua sisi kata) adalah bagian standar dari python. Ini tidak tersedia dalam modul berbasis C, misalnya, tetapi harus selalu tersedia dalam skrip python.
Bryan Oakley
10
Saya akan merekomendasikan menggunakan realpath daripada abspath untuk menyelesaikan tautan simbolis yang mungkin.
TTimo
12
@ cph2117: ini hanya akan berfungsi jika Anda menjalankannya dalam skrip. Tidak ada __file__jika lari dari prompt interaktif. \
Bryan Oakley
99
Menggunakan Path adalah cara yang disarankan sejak Python 3:
from pathlib importPathprint("File Path:",Path(__file__).absolute())print("Directory Path:",Path().absolute())
Saya harus lakukan Path(__file__).parentuntuk mendapatkan folder yang berisi file
YellowPillow
Itu benar @YellowPillow, Path(__file__)memberi Anda file. .parentmembuat Anda satu tingkat di atas yaitu direktori yang berisi. Anda dapat menambahkan lebih banyak .parentuntuk itu naik direktori sebanyak yang Anda butuhkan.
Ron Kalian
1
Maaf saya seharusnya membuat ini lebih jelas, tetapi jika Path().absolute()ada dalam beberapa modul yang terletak di path/to/moduledan Anda memanggil modul dari beberapa skrip yang terletak di path/to/scriptkemudian akan kembali path/to/scriptsebagai gantinyapath/to/module
YellowPillow
1
@YellowPillow Path(__file__).cwd()lebih eksplisit
Charles
1
Path(__file__)tidak selalu berfungsi, misalnya, tidak berfungsi di Jupyter Notebook. Path().absolute()memecahkan masalah itu.
Ron Kalian
43
Dalam Python 3.x saya lakukan:
from pathlib importPath
path =Path(__file__).parent.absolute()
Penjelasan:
Path(__file__) adalah jalur ke file saat ini.
.parentmemberi Anda direktori file.
.absolute()memberi Anda jalan absolut penuh untuk itu.
Menggunakan pathlibadalah cara modern untuk bekerja dengan jalur. Jika Anda membutuhkannya sebagai string nanti untuk beberapa alasan, lakukan saja str(path).
Ini harus menjadi jawaban diterima pada 2019. Satu hal yang bisa disebutkan dalam jawabannya juga: satu dapat segera memanggil .open()pada suatu Pathobjek seperti diwith Path(__file__).parent.joinpath('some_file.txt').open() as f:
Maaf tapi jawaban ini salah, yang benar adalah yang dibuat oleh Bryan `dirname (abspath ( file )). Lihat komentar untuk detailnya.
sorin
1
Ini akan memberikan / sebagai output
Tripathi29
2
@sorin Sebenarnya pada Python 3.6 keduanya sama
DollarAkshay
5
Anda dapat menggunakan osdan os.pathperpustakaan dengan mudah sebagai berikut
import os
os.chdir(os.path.dirname(os.getcwd()))
os.path.dirnamemengembalikan direktori atas dari yang sekarang. Itu memungkinkan kita mengubah ke level atas tanpa melewati argumen file apa pun dan tanpa mengetahui path absolut.
Ini tidak memberikan direktori file saat ini . Ia mengembalikan direktori direktori kerja saat ini yang mungkin sangat berbeda. Apa yang Anda sarankan hanya berfungsi jika file tersebut ada di direktori kerja saat ini.
Bryan Oakley
4
Coba ini:
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))
KELUARAN:
PATH MUTLAK ADALAH PATH DIMANA FILE PYTHON ANDA DITEMPATKAN
Path absolut: D: \ Study \ Machine Learning \ Jupitor Notebook \ JupytorNotebookTest2 \ Udacity_Scripts \ Matplotlib dan seaborn Part2
Jalur file: D: \ Study \ Machine Learning \ Jupitor Notebook \ JupytorNotebookTest2 \ Udacity_Scripts \ Matplotlib dan seaborn Part2 \ data \ fuel_econ.csv
@ Kiro, solusi saya menjawab pertanyaan menggunakan IPython. Misalnya, jika seseorang menjawab pertanyaan dengan solusi menggunakan perpustakaan baru, maka ia juga tetap menjawab pertanyaan tersebut.
Nafeez Quraishi
@NafeezQuraishi solusi Anda memperkenalkan perpustakaan pihak ketiga, dan kelas dari mana Anda harus instantiate untuk mencapai hasil yang diinginkan. Saya sendiri, dan saya pikir banyak orang lain mencoba untuk menghindari menggunakan perpustakaan eksternal karena sejumlah alasan, dan saya hanya akan mencoba solusi Anda jika tidak ada yang berhasil. Untungnya, ada serangkaian fungsi bawaan yang dapat Anda gunakan untuk mendapatkan hasil yang diinginkan, dan tanpa perlu perpustakaan eksternal.
elliotwesoff
@ elli0t, setuju sebagian. Pertimbangkan seseorang yang menggunakan notebook Jupyter memiliki pertanyaan ini untuk siapa mungkin menggunakan perintah% pwd magic akan lebih mudah dan lebih disukai daripada os import.
Nafeez Quraishi
0
Untuk menjaga konsistensi migrasi lintas platform (macOS / Windows / Linux), coba:
## 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
Direktori kerja saat ini mungkin tidak sama dengan direktori file saat ini. Solusi Anda hanya akan berfungsi jika direktori kerja saat ini sama dengan direktori yang menyimpan file. Itu bisa sangat umum selama pengembangan, tetapi biasanya cukup langka untuk skrip yang digunakan.
Bryan Oakley
Terimakasih atas infonya. Saya memperbarui jawaban saya untuk mencerminkan kemungkinan bahwa ini mungkin tidak setara dengan mengembalikan file yang sama. Itulah alasan mengapa saya berpegang pada filosofi pengkodean yang disebut "pemrograman tambahan", pengujian, dan banyak fungsi panggilan () dipanggil untuk menguji output dan / atau nilai-nilai kembali pada setiap langkah. Saya harap kode saya sekarang lebih mencerminkan realitas os.path.abspath () vs os.getcwd () karena saya tidak mengklaim tahu segalanya. Namun Anda dapat melihat bahwa saya meletakkan os.getcwd () di komentar sebagai bukan solusi utama, melainkan sebagai potongan kode alt yang perlu diingat dan diperiksa.
Programmer Yerusalem
PS Saya pikir seseorang mengedit dan menghapus sebagian besar jawaban saya yang saya posting di sini ... :( Hal itu membuat orang-orang enggan berpartisipasi jika jawaban mereka akan disensor dan dipotong.
Programmer Jerusalem
1
Anda satu-satunya orang yang mengedit jawaban ini. Selain itu, hasil edit Anda masih belum menjawab pertanyaan dengan benar. Pertanyaannya secara khusus menanyakan tentang jalur ke direktori file, dan jawaban Anda hanya menyebutkan mendapatkan direktori saat ini. Itu bukan jawaban yang benar, karena direktori saat ini sangat sering tidak sama dengan direktori tempat skrip berada. Ini tidak ada hubungannya dengan abspath.
Bryan Oakley
Paling pasti kode yang saya bagikan memberi path ke direktori file jika dijalankan dari direktori dan / atau file dari tempat Anda ingin mengetahui path file absolut. Paling pasti itu adalah jawaban yang benar. Tolong jangan menjadi troll.
__file__
tidak didefinisikan ketika Anda menjalankan python sebagai shell interaktif. Sepotong kode pertama dalam pertanyaan Anda sepertinya berasal dari shell interaktif, tetapi sebenarnya akan menghasilkanNameError
, setidaknya dengan python 2.7.3, tetapi yang lain juga saya kira.Jawaban:
Python 3
Untuk direktori skrip dijalankan:
Untuk direktori kerja saat ini:
Python 2 dan 3
Untuk direktori skrip dijalankan:
Jika Anda maksud direktori kerja saat ini:
Perhatikan bahwa sebelum dan sesudah
file
adalah dua garis bawah, bukan hanya satu.Juga perhatikan bahwa jika Anda menjalankan secara interaktif atau telah memuat kode dari sesuatu selain file (misalnya: database atau sumber daya online),
__file__
mungkin tidak diatur karena tidak ada gagasan "file saat ini". Jawaban di atas mengasumsikan skenario paling umum menjalankan skrip python yang ada dalam file.Referensi
sumber
__file__
(perhatikan bahwa dua garis bawah pada kedua sisi kata) adalah bagian standar dari python. Ini tidak tersedia dalam modul berbasis C, misalnya, tetapi harus selalu tersedia dalam skrip python.__file__
jika lari dari prompt interaktif. \Menggunakan
Path
adalah cara yang disarankan sejak Python 3:Dokumentasi: pathlib
Catatan: Jika menggunakan Notebook Jupyter,
__file__
tidak mengembalikan nilai yang diharapkan, jadiPath().absolute()
harus digunakan.sumber
Path(__file__).parent
untuk mendapatkan folder yang berisi filePath(__file__)
memberi Anda file..parent
membuat Anda satu tingkat di atas yaitu direktori yang berisi. Anda dapat menambahkan lebih banyak.parent
untuk itu naik direktori sebanyak yang Anda butuhkan.Path().absolute()
ada dalam beberapa modul yang terletak dipath/to/module
dan Anda memanggil modul dari beberapa skrip yang terletak dipath/to/script
kemudian akan kembalipath/to/script
sebagai gantinyapath/to/module
Path(__file__).cwd()
lebih eksplisitPath(__file__)
tidak selalu berfungsi, misalnya, tidak berfungsi di Jupyter Notebook.Path().absolute()
memecahkan masalah itu.Dalam Python 3.x saya lakukan:
Penjelasan:
Path(__file__)
adalah jalur ke file saat ini..parent
memberi Anda direktori file..absolute()
memberi Anda jalan absolut penuh untuk itu.Menggunakan
pathlib
adalah cara modern untuk bekerja dengan jalur. Jika Anda membutuhkannya sebagai string nanti untuk beberapa alasan, lakukan sajastr(path)
.sumber
.open()
pada suatuPath
objek seperti diwith Path(__file__).parent.joinpath('some_file.txt').open() as f:
sumber
/
sebagai outputAnda dapat menggunakan
os
danos.path
perpustakaan dengan mudah sebagai berikutos.path.dirname
mengembalikan direktori atas dari yang sekarang. Itu memungkinkan kita mengubah ke level atas tanpa melewati argumen file apa pun dan tanpa mengetahui path absolut.sumber
Coba ini:
sumber
Saya menemukan perintah-perintah berikut ini akan mengembalikan path lengkap direktori induk skrip Python 3.6.
Python 3.6 Script:
Tautan penjelasan: .resolve () , .absolute () , Path ( file ) .parent (). Absolute ()
sumber
Sistem: MacOS
Versi: Python 3.6 w / Anaconda
sumber
PROPERTI JALUR BERMANFAAT DI PYTHON:
KELUARAN: PATH MUTLAK ADALAH PATH DIMANA FILE PYTHON ANDA DITEMPATKAN
Path absolut: D: \ Study \ Machine Learning \ Jupitor Notebook \ JupytorNotebookTest2 \ Udacity_Scripts \ Matplotlib dan seaborn Part2
Jalur file: D: \ Study \ Machine Learning \ Jupitor Notebook \ JupytorNotebookTest2 \ Udacity_Scripts \ Matplotlib dan seaborn Part2 \ data \ fuel_econ.csv
isfileExist: Benar
direktori: Salah
Ekstensi file: .csv
sumber
Jika Anda hanya ingin melihat direktori kerja saat ini
Jika Anda ingin mengubah direktori kerja saat ini
path adalah string yang berisi path yang diperlukan untuk dipindahkan. misalnya
sumber
IPython
memiliki perintah ajaib%pwd
untuk mendapatkan direktori kerja saat ini. Ini dapat digunakan dengan cara berikut:Pada IPython Jupyter Notebook
%pwd
dapat digunakan secara langsung sebagai berikut:sumber
Untuk menjaga konsistensi migrasi lintas platform (macOS / Windows / Linux), coba:
sumber
Saya telah membuat fungsi untuk digunakan ketika menjalankan python di bawah IIS di CGI untuk mendapatkan folder saat ini:
sumber
Mari kita asumsikan Anda memiliki struktur direktori berikut: -
utama / fold1 fold2 fold3 ...
sumber
sumber
abspath
.