更新於 2023/08/23閱讀時間約 0 分鐘

【💊 Python的解憂錦囊】取得沒有副檔名檔案名稱(filename without the extension)


圖片來源

圖片來源

請耐心閱讀到最後, 我們會提供更優雅的方式來處理這項需求…

故事起源

我們常常在使用Python的過程中會進行I/O的一些處理, 那麼最基本的就會是讀取檔案列表並對每一個特定的檔案名稱進行處理, 像這樣:

import glob

mp4_files = glob.glob(os.path.join(pwd, '**/*.mp4'))

那假設我們的檔案擺放預期如下, 會有一個影片檔配一個字幕檔:

|- dir
|- xxx.srt
|- xxx.mp4


情境題

❓ 今天我們打算開發一個小工具, 那麼小工具的功能主要是「檢查每個影片檔都需要有字幕檔」。

遇到上述的情境, 你會怎麼做?

嗯…非常簡單, 我們在列舉檔案清單的過程中(在前面的故事起源有提到讀取檔案列表), 那該檔案清單的內容為:

txt_files

# dir/1.mp4
# dir/2.mp4
...
# dir/${檔名}.mp4

接下來我們只要設法解析出「檔名」的部份再結合字串組合成「1.srt」去檢查該檔案是否存在即可, 看到這裡會有個關鍵點需要處理:

  1. 如何取得沒有副檔名(.mp4)的檔名。
  2. 檔案路徑組合。
  3. 檢查檔案(.srt)是否存在。


帶你解題

有鑑於上述的情境題, 我們應該要好好發揮軟體開發的專長來進行解題一番, 那麼首先我們稍微看了一下Python的標準函式庫之中有個不錯的功能可以使用也就是 ➡️「os.path」, 讓我們來 ⛏️ 挖挖看有沒有寶藏吧!

看來有一個東西還不錯, 可能會是我們需要的答案:

import os

file_path = 'dir/1.mp4'
# 1.mp4
basename = os.path.basename(file_path)

我們可以看到它雖然可以幫我們去除路徑, 也順利取得檔案名稱, 但這個結果顯然還不是非常理想, 仍然具有副檔名(.mp4)。

進一步來說我們還可以土炮一點這樣做

# basename = 1.mp4
# 1
print(os.path.splitext(basename)[0])

更好的方法...

嗯…雖然達成了我們的目的, 但好像有點冗長啊! 有沒有更好的技巧呢? 答案是有的, 就讓我們來為您說明一番吧, 咱們來看看「pathlib」這個酷東西唄, 它提供了更優雅的方式來處理檔案路徑的一些操作, 以上述情境為例我們可以這樣做:

from pathlib import Path

file_path = 'dir/1.mp4'

# 透過.stem取得無後綴的純路徑
print(Path(file_path).stem)

P.S ⚠️ 這個模組需要Python 3.4以上的版本才能使用喔!

另外對於「.stem」這個API有興趣的朋友, 這裡提供連結給您查閱:

🌐 PurePath.stem


喜歡撰寫文章的你,不妨來了解一下:

Web3.0時代下為創作者、閱讀者打造的專屬共贏平台 — 為什麼要加入?

歡迎加入一起練習寫作,賺取知識

分享至
成為作者繼續創作的動力吧!
© 2024 vocus All rights reserved.