Senar terakhir tidak harus dimulai dengan garis miring. Jika mereka mulai dengan garis miring, maka itu dianggap sebagai "jalur absolut" dan segala sesuatu sebelum mereka dibuang.
Mengutip dokumen Python untukos.path.join
:
Jika komponen adalah jalur absolut, semua komponen sebelumnya dibuang dan bergabung terus dari komponen jalur absolut.
Catatan di Windows, perilaku dalam kaitannya dengan huruf drive, yang tampaknya telah berubah dibandingkan dengan versi Python sebelumnya:
Pada Windows, huruf drive tidak diatur ulang ketika komponen jalur absolut (misalnya, r'\foo'
) ditemukan. Jika komponen berisi huruf drive, semua komponen sebelumnya dibuang dan huruf drive diatur ulang. Perhatikan bahwa karena ada direktori saat ini untuk setiap drive, os.path.join("c:", "foo")
mewakili jalur relatif ke direktori saat ini di drive C:
( c:foo
), bukan c:\foo
.
os.path.normpath
untuk mencapai tujuan itu.Idenya
os.path.join()
adalah untuk membuat program Anda cross-platform (linux / windows / etc).Bahkan satu tebasan menghancurkannya.
Jadi itu hanya masuk akal ketika digunakan dengan semacam titik referensi seperti
os.environ['HOME']
atauos.path.dirname(__file__)
.sumber
os.path.join()
dapat digunakan bersamaan denganos.path.sep
untuk membuat jalur absolut daripada relatif.sumber
os.path.sep
sebagai elemen pertama untuk membangun jalur absolut lebih baik daripada jawaban lain di sini! Inti dari menggunakanos.path
daripada metode str dasar adalah untuk menghindari menulis/
. Menempatkan setiap subdirektori sebagai argumen baru dan menghapus semua garis miring juga bagus. Mungkin akan menjadi ide yang baik untuk memastikan dengan cek yangtodaystr
tidak dimulai dengan garis miring! ;)Jangan gunakan garis miring di awal komponen jalur, kecuali saat merujuk ke direktori root:
lihat juga: http://docs.python.org/library/os.path.html#os.path.join
sumber
Untuk membantu memahami mengapa perilaku mengejutkan ini tidak sepenuhnya mengerikan, pertimbangkan aplikasi yang menerima nama file konfigurasi sebagai argumen:
Jika aplikasi dijalankan dengan:
File config
/etc/myapp.conf/foo.conf
akan digunakan.Tetapi pertimbangkan apa yang terjadi jika aplikasi dipanggil dengan:
Maka
myapp
harus menggunakan file konfigurasi at/some/path/bar.conf
(dan tidak/etc/myapp.conf/some/path/bar.conf
atau serupa).Ini mungkin tidak bagus, tetapi saya percaya ini adalah motivasi untuk perilaku jalur absolut.
sumber
Itu karena Anda
'/new_sandbox/'
mulai dengan a/
dan dengan demikian dianggap relatif terhadap direktori root. Hapus yang memimpin/
.sumber
Untuk membuat fungsi Anda lebih portabel, gunakan seperti ini:
atau
sumber
Coba kombo
split("/")
dan*
untuk string dengan gabungan yang ada.Bagaimana itu bekerja...
split("/")
mengubah jalur yang ada menjadi daftar:['', 'home', 'build', 'test', 'sandboxes', '']
*
di depan daftar pecah setiap item daftar parameternya sendirisumber
Coba
new_sandbox
sajasumber
lakukan seperti ini, tanpa terlalu banyak garis miring
sumber
Perhatikan bahwa masalah serupa dapat menggigit Anda jika Anda menggunakan
os.path.join()
untuk menyertakan ekstensi yang sudah menyertakan titik, yang merupakan apa yang terjadi secara otomatis saat Anda menggunakanos.path.splitext()
. Dalam contoh ini:Meskipun
extension
mungkin.jpg
Anda berakhir dengan folder bernama "foobar" daripada file bernama "foobar.jpg". Untuk mencegahnya, Anda perlu menambahkan ekstensi secara terpisah:sumber
Anda dapat
strip
dengan'/'
:sumber
Saya akan merekomendasikan untuk menghapus dari string kedua dan berikut string
os.path.sep
, mencegah mereka ditafsirkan sebagai jalur absolut:sumber
versi yang lebih lengkap:
sumber
"\"
? Kemudian contoh pertama Anda menjadios.path.join("a", *"/b".split("\\"))
, yang menghasilkan"/b"
... Saya ragu itu adalah hasil yang dimaksudkan.