Apakah ada fungsi built-in dalam Python yang akan menggantikan (atau menghapus, apapun) ekstensi nama file (jika ada)?
Contoh:
print replace_extension('/home/user/somefile.txt', '.jpg')
Dalam contoh saya: /home/user/somefile.txt
akan menjadi/home/user/somefile.jpg
Saya tidak tahu apakah itu penting, tetapi saya membutuhkan ini untuk modul SCons yang saya tulis. (Jadi mungkin ada beberapa fungsi khusus SCons yang dapat saya gunakan?)
Saya mau yang bersih . Melakukan penggantian string sederhana dari semua kejadian .txt
di dalam string jelas tidak bersih. (Ini akan gagal jika nama file saya somefile.txt.txt.txt
)
Jawaban:
Coba os.path.splitext itu harus melakukan apa yang Anda inginkan.
sumber
print os.path.join(os.path.splitext('/home/user/somefile.txt')[0], '.jpg')
akan kembali/home/user/somefile/.jpg
, yang tidak diinginkan.Memperluas jawaban AnaPana, cara menghapus ekstensi menggunakan pathlib (Python> = 3.4):
sumber
pth = Path('data/foo.tar.gz'); print(pth.with_suffix('.jpg'))
akan mengeluarkan'data/foo.tar.jpg'
. Saya kira Anda bisa melakukannyapth.with_suffix('').with_suffix('.jpg')
, tetapi itu kikuk, dan Anda perlu menambahkan rantai.with_suffix('')
panggilan yang panjang secara sewenang-wenang untuk menangani sejumlah titik.
dalam ekstensi file (memang, lebih dari 2 adalah kasus tepi eksotis).while
loop untuk menyelesaikannya:pth = Path('data/foo.tar.gz'); while pth != pth.with_suffix(''): pth = pth.with_suffix(''); pth = pth.with_suffix('.jpg')
Seperti yang dikatakan @jethro,
splitext
adalah cara terbaik untuk melakukannya. Tetapi dalam kasus ini, cukup mudah untuk membaginya sendiri, karena ekstensi harus menjadi bagian dari nama file yang muncul setelah periode terakhir:Perintah tersebut
rsplit
memberitahu Python untuk melakukan pemisahan string mulai dari kanan string, dan perintah1
untuk melakukan paling banyak satu pemisahan (misalnya'foo.bar.baz'
->[ 'foo.bar', 'baz' ]
). Karenarsplit
akan selalu mengembalikan array yang tidak kosong, kita dapat mengindeksnya dengan aman0
untuk mendapatkan nama file dikurangi ekstensi.sumber
rsplit
akan menghasilkan hasil yang berbeda untuk file yang dimulai dengan titik dan tidak memiliki ekstensi lain (seperti file tersembunyi di Linux, misalnya.bashrc
).os.path.splitext
mengembalikan ekstensi kosong untuk ini, tetapi menggunakanrsplit
akan memperlakukan seluruh nama file sebagai ekstensi./home/john.johnson/somefile
Saya lebih suka pendekatan satu baris berikut menggunakan str.rsplit () :
Contoh:
sumber
Untuk Python> = 3.4:
sumber
Menangani banyak ekstensi
Dalam kasus di mana Anda memiliki beberapa ekstensi, satu baris ini menggunakan
pathlib
danstr.replace
bekerja dengan baik:Hapus / strip ekstensi
Ganti ekstensi
Jika Anda juga menginginkan
pathlib
keluaran objek maka Anda dapat dengan jelas membungkus barisPath()
Membungkus semuanya dalam sebuah fungsi
sumber
with_suffix
alih-alihreplace
hanya akan menghapus.gz
alih-alih.tar.gz
Jawaban saya dimaksudkan untuk menjadi "umum", tetapi jika Anda hanya mengharapkan satu ekstensi,with_suffix
akan menjadi solusi yang lebih bersih.Cara lain yang bisa dilakukan adalah dengan menggunakan
str.rpartition(sep)
metode tersebut.Sebagai contoh:
sumber