Saya biasa membuka file yang berada di direktori yang sama dengan skrip Python yang sedang berjalan dengan hanya menggunakan perintah seperti
open("Some file.txt", "r")
Namun, saya menemukan bahwa ketika skrip dijalankan di Windows dengan mengklik dua kali, skrip akan mencoba membuka file dari direktori yang salah.
Sejak itu saya telah menggunakan perintah form
open(os.path.join(sys.path[0], "Some file.txt"), "r")
setiap kali saya ingin membuka file. Ini berfungsi untuk penggunaan khusus saya, tetapi saya tidak yakin apakah sys.path[0]
mungkin gagal dalam beberapa kasus penggunaan lainnya.
Jadi pertanyaan saya adalah: Apa cara terbaik dan paling dapat diandalkan untuk membuka file yang ada di direktori yang sama dengan skrip Python yang sedang berjalan?
Inilah yang saya sudah bisa mencari tahu sejauh ini:
os.getcwd()
danos.path.abspath('')
kembalikan "direktori kerja saat ini", bukan direktori skrip.os.path.dirname(sys.argv[0])
danos.path.dirname(__file__)
kembalikan jalur yang digunakan untuk memanggil skrip, yang mungkin relatif atau bahkan kosong (jika skrip berada di cwd). Juga,__file__
tidak ada ketika skrip dijalankan di IDLE atau PythonWin.sys.path[0]
danos.path.abspath(os.path.dirname(sys.argv[0]))
sepertinya mengembalikan direktori skrip. Saya tidak yakin apakah ada perbedaan antara keduanya.
Edit:
Saya baru menyadari bahwa apa yang ingin saya lakukan akan lebih baik digambarkan sebagai "buka file di direktori yang sama dengan modul yang mengandung". Dengan kata lain, jika saya mengimpor modul yang saya tulis itu di direktori lain, dan modul itu membuka file, saya ingin mencari file di direktori modul. Saya tidak berpikir apa pun yang saya temukan dapat melakukan itu ...
__file__
tidak dapat digunakan, maka gunakansys.argv[0]
sebagai gantinyadirname(__file__)
. Sisanya harus bekerja seperti yang diharapkan. Saya suka menggunakan__file__
karena dalam kode pustaka,sys.argv[0]
mungkin tidak menunjuk ke kode Anda sama sekali, terutama jika diimpor melalui beberapa skrip pihak ke-3.