Menggunakan os.path.split
atauos.path.basename
seperti yang orang lain sarankan tidak akan berfungsi dalam semua kasus: jika Anda menjalankan skrip di Linux dan mencoba untuk memproses jalur gaya windows klasik, itu akan gagal.
Jalur Windows dapat menggunakan backslash atau forward slash sebagai pemisah jalur. Oleh karena itu, ntpath
modul (yang setara dengan os.path saat berjalan di windows) akan bekerja untuk semua (1) jalur di semua platform.
import ntpath
ntpath.basename("a/b/c")
Tentu saja, jika file berakhir dengan garis miring, nama dasarnya akan kosong, jadi buatlah fungsi Anda sendiri untuk menghadapinya:
def path_leaf(path):
head, tail = ntpath.split(path)
return tail or ntpath.basename(head)
Verifikasi:
>>> paths = ['a/b/c/', 'a/b/c', '\\a\\b\\c', '\\a\\b\\c\\', 'a\\b\\c',
... 'a/b/../../a/b/c/', 'a/b/../../a/b/c']
>>> [path_leaf(path) for path in paths]
['c', 'c', 'c', 'c', 'c', 'c', 'c']
(1) Ada satu peringatan: nama file Linux mungkin mengandung garis miring terbalik . Jadi di linux, r'a/b\c'
selalu merujuk ke file b\c
di a
folder, sedangkan di Windows, selalu merujuk ke c
file di b
subfolder a
folder. Jadi, ketika garis miring maju dan mundur digunakan di jalur, Anda perlu mengetahui platform terkait untuk dapat menafsirkannya dengan benar. Dalam praktiknya, biasanya aman untuk menganggapnya sebagai jalur windows karena backslash jarang digunakan dalam nama file Linux, tetapi ingatlah ini ketika Anda membuat kode sehingga Anda tidak membuat lubang keamanan yang tidak disengaja.
os.path
muatntpath
modul secara internal. Dengan menggunakan modul ini, dimungkinkan untuk menangani'\\'
separator path bahkan pada mesin Linux. Untuk Linuxposixpath
modul (resp.os.path
) Akan menyederhanakan operasi jalur untuk memungkinkan hanya'/'
pemisah gaya posix.r'C:\path\to\file.txt'
) pada mesin Linux, Anda perlu menggunakan modul ntpath. Jika tidak, Anda dapat menggunakan fungsi dari os.path. Ini karena sistem Linux biasanya memungkinkan penggunaan karakter backslash dalam nama file (seperti yang dijelaskan dalam jawaban).os.path.basename(os.path.normpath(path))
?Sebenarnya, ada fungsi yang mengembalikan apa yang Anda inginkan
sumber
os.path.basename(your_path)
Ini berhasil! Saya ingin skrip jalan:os.path.dirname(os.path.realpath(__file__))
dan nama skrip:os.path.basename(os.path.realpath(__file__))
. Terima kasih!'C:\\temp\\bla.txt'
.os.path.split adalah fungsi yang Anda cari
sumber
Dengan python 3
sumber
ekor adalah apa yang Anda inginkan, nama file.
Lihat dokumen modul python os untuk detailnya
sumber
sumber
Dalam contoh Anda, Anda juga perlu menghapus garis miring dari kanan untuk kembali
c
:Tingkat kedua:
pembaruan: Saya pikir
lazyr
telah memberikan jawaban yang benar. Kode saya tidak akan bekerja dengan jalur seperti Windows di sistem unix dan sebaliknya dibandingkan dengan jalur seperti di sistem windows.sumber
r"a\b\c"
di linux, atau untuk"a/b/c"
di windows.os.path.basename(path)
hanya akan berfungsi jikaos.path.isfile(path)
adaTrue
. Karena itupath = 'a/b/c/'
sama sekali bukan nama file yang valid ...os.path.basename("a/b/c/")
kembali""
karena garis miring.lazyr
kamu benar! Saya tidak memikirkan hal itu. Apakah aman untuk melakukannyapath = path.replace('\\', '/')
?ini akan kembali: paint.exe
sumber
fname = str(path).split('/')[-1]
Jika Anda ingin mendapatkan nama file secara otomatis, Anda dapat melakukannya
sumber
Jika jalur file Anda tidak berakhir dengan "/" dan direktori dipisahkan oleh "/" maka gunakan kode berikut. Seperti yang kita ketahui umumnya path tidak berakhir dengan "/".
Tetapi dalam beberapa kasus seperti URL diakhiri dengan "/" lalu gunakan kode berikut
tetapi ketika path Anda di-sperated oleh "\" yang biasanya Anda temukan di path windows maka Anda dapat menggunakan kode-kode berikut
Anda dapat menggabungkan keduanya menjadi satu fungsi dengan memeriksa tipe OS dan mengembalikan hasilnya.
sumber
Ini berfungsi untuk linux dan windows juga dengan perpustakaan standar
Hasil:
sumber
Inilah solusi khusus regex, yang tampaknya berfungsi dengan jalur OS apa pun pada OS apa pun.
Tidak diperlukan modul lain, dan tidak perlu preprocessing:
Memperbarui:
Jika Anda hanya ingin potensial nama file, jika ada (yaitu,
/a/b/
adalah dir dan begitu jugac:\windows\
), mengubah regex untuk:r'[^\\/]+(?![\\/])$'
. Untuk "regex challengeed," ini mengubah lookahead maju positif untuk semacam garis miring menjadi lookahead maju negatif, menyebabkan nama path yang berakhir dengan slash tersebut tidak menghasilkan apa-apa alih-alih sub-direktori terakhir dalam pathname. Tentu saja tidak ada jaminan bahwa nama file potensial sebenarnya mengacu pada file dan untuk ituos.path.is_dir()
atauos.path.is_file()
perlu dipekerjakan.Ini akan cocok sebagai berikut:
Regex dapat diuji di sini .
sumber
Mungkin hanya solusi all in one saya tanpa beberapa yang baru (anggap tempfile untuk membuat file sementara: D)
Mendapatkan nilai
abc.name
akan menjadi string seperti ini:'/tmp/tmpks5oksk7'
Jadi saya bisa mengganti/
dengan spasi.replace("/", " ")
dan kemudian memanggilsplit()
. Itu akan mengembalikan daftar dan saya mendapatkan elemen terakhir dari daftar[-1]
Tidak perlu mengimpor modul apa pun.
sumber
Saya belum pernah melihat jalur backslashed ganda, apakah mereka ada? Fitur bawaan modul python
os
gagal untuk mereka. Semua yang lain berfungsi, juga peringatan yang diberikan oleh Anda denganos.path.normpath()
:sumber
Pemisah Windows dapat berupa nama file Unix atau Windows Path. Pemisah Unix hanya bisa ada di jalur Unix. Kehadiran pemisah Unix menunjukkan jalur non-Windows.
Berikut ini akan menghapus (memotong trailing separator) oleh pemisah khusus OS, kemudian membelah dan mengembalikan nilai paling kanan. Itu jelek, tapi sederhana berdasarkan asumsi di atas. Jika asumsi ini salah, harap perbarui dan saya akan memperbarui respons ini agar sesuai dengan ketentuan yang lebih akurat.
Kode sampel:
sumber
Demi kelengkapan, berikut adalah
pathlib
solusi untuk python 3.2+:Ini berfungsi pada Windows dan Linux.
sumber
Dalam Python 2 dan 3, menggunakan modul pathlib2 :
Pemakaian:
Dengan testcase Anda:
Idenya di sini adalah untuk mengubah semua jalur menjadi representasi internal terpadu
pathlib2
, dengan decoder yang berbeda tergantung pada platform. Untungnya,pathlib2
termasuk decoder generik yang disebutPurePath
yang harus bekerja pada jalur apa pun. Jika ini tidak berhasil, Anda dapat memaksa pengenalan jalur windows menggunakanfromwinpath=True
. Ini akan membagi string input menjadi beberapa bagian, yang terakhir adalah daun yang Anda cari, karenanyapath2unix(t)[-1]
.Jika argumen
nojoin=False
, jalur akan bergabung kembali, sehingga output hanyalah string input yang dikonversi ke format Unix, yang dapat bermanfaat untuk membandingkan subpath di seluruh platform.sumber