Bagaimana cara mendapatkan path lengkap dari direktori file saat ini?

805

Saya ingin mendapatkan jalur direktori file saat ini. Saya mencoba:

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

Tetapi bagaimana saya bisa mengambil jalur direktori?

Sebagai contoh:

'C:\\python27\\'
Shubham
sumber
4
kemungkinan duplikat Temukan direktori saat ini dan direktori file
user2284570
5
__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.
drevicko

Jawaban:

1636

Python 3

Untuk direktori skrip dijalankan:

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

Untuk direktori kerja saat ini:

import pathlib
pathlib.Path().absolute()

Python 2 dan 3

Untuk direktori skrip dijalankan:

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.

Referensi

  1. pathlib dalam dokumentasi python.
  2. os.path 2.7 , os.path 3.8
  3. os.getcwd 2.7 , os.getcwd 3.8
  4. apa arti / lakukan variabel __file__?
Bryan Oakley
sumber
43
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 import Path
print("File      Path:", Path(__file__).absolute())
print("Directory Path:", Path().absolute())  

Dokumentasi: pathlib

Catatan: Jika menggunakan Notebook Jupyter, __file__tidak mengembalikan nilai yang diharapkan, jadi Path().absolute()harus digunakan.

Ron Kalian
sumber
17
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 import Path

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

Arminius
sumber
3
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:
stefanct
9
import os
print os.path.dirname(__file__)
tukang masak
sumber
21
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.

mulg0r
sumber
7
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__))
Akshaya Natarajan
sumber
2

Saya menemukan perintah-perintah berikut ini akan mengembalikan path lengkap direktori induk skrip Python 3.6.

Python 3.6 Script:

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

Tautan penjelasan: .resolve () , .absolute () , Path ( file ) .parent (). Absolute ()

Beruang Madu
sumber
2

Sistem: MacOS

Versi: Python 3.6 w / Anaconda

import os

rootpath = os.getcwd()

os.chdir(rootpath)
Suyang Xu
sumber
1

PROPERTI JALUR BERMANFAAT DI 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))

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

Arpan Saini
sumber
1

Jika Anda hanya ingin melihat direktori kerja saat ini

import os
print(os.getcwd)

Jika Anda ingin mengubah direktori kerja saat ini

os.chdir(path)

path adalah string yang berisi path yang diperlukan untuk dipindahkan. misalnya

path = "C:\\Users\\xyz\\Desktop\\move here"
Bhatti Majid
sumber
0

IPythonmemiliki perintah ajaib %pwduntuk mendapatkan direktori kerja saat ini. Ini dapat digunakan dengan cara berikut:

from IPython.terminal.embed import InteractiveShellEmbed

ip_shell = InteractiveShellEmbed()

present_working_directory = ip_shell.magic("%pwd")

Pada IPython Jupyter Notebook %pwddapat digunakan secara langsung sebagai berikut:

present_working_directory = %pwd
Nafeez Quraishi
sumber
5
Pertanyaannya bukan tentang IPython
Kiro
1
@ 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:

path = r'%s' % os.getcwd().replace('\\','/')
Qiao Zhang
sumber
0

Saya telah membuat fungsi untuk digunakan ketika menjalankan python di bawah IIS di CGI untuk mendapatkan folder saat ini:

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

Mari kita asumsikan Anda memiliki struktur direktori berikut: -

utama / 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)
dPac
sumber
-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
Programmer Yerusalem
sumber
2
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.
Programmer Yerusalem