Pythonでファイル処理を行う際、拡張子を除いたファイル名のみを取得したい場面は頻繁にあります。例えば、ファイルをリネームする際や、ファイル名をもとにフォルダを作成する場合などでしょう。
このような処理には、主にos.path
モジュールとpathlib
モジュールの2つのアプローチが存在します。どちらも効果的ですが、使用する場面や好みによって選択が分かれることになります。本記事では、それぞれの方法を具体的なサンプルコードとともに詳しく解説していきます。
os.pathモジュールで拡張子なしのファイル名を取得する方法
os.path
モジュールは、Pythonの標準ライブラリとして長く使われてきました。
ファイルパス操作に関する多くの機能を提供しており、拡張子なしのファイル名取得にも複数の手法があります。
os.path.splitext()で分割する
最も一般的で推奨される方法が、os.path.splitext()関数の使用でしょう。
この関数は、ファイルパスを拡張子部分とそれ以外に分割してくれます。
import os
# ファイルパスの例
file_path = "/home/user/documents/sample.txt"
# splitext()でファイルパスを分割
name_without_ext, extension = os.path.splitext(file_path)
print(f"拡張子なしのパス: {name_without_ext}")
print(f"拡張子: {extension}")
# ベースファイル名のみを取得する場合
basename_without_ext = os.path.splitext(os.path.basename(file_path))[0]
print(f"ファイル名のみ(拡張子なし): {basename_without_ext}")
【実行結果】
拡張子なしのパス: /home/user/documents/sample
拡張子: .txt
ファイル名のみ(拡張子なし): sample
os.path.splitext()は、引数として渡されたパスの最後にある拡張子を分離します。
戻り値は2つの要素を持つタプルになっており、1つ目が拡張子を除いたパス、2つ目が拡張子部分(ピリオドを含む)となります。
フルパスではなくファイル名のみが欲しい場合は、os.path.basename()と組み合わせることで実現できます。
上記の例では、os.path.basename()でファイル名部分だけを抽出してからsplitext()を適用しています。
rsplit() を使う
文字列のrsplit()メソッドを使用する方法もあります。
これは右側(末尾)から指定した区切り文字で分割する手法です。
import os
# ファイルパスの例
file_path = "/home/user/documents/report.pdf"
# ベースファイル名を取得
basename = os.path.basename(file_path)
# rsplit()で拡張子を分離
if '.' in basename:
name_without_ext = basename.rsplit('.', 1)[0]
extension = '.' + basename.rsplit('.', 1)[1]
else:
name_without_ext = basename
extension = ''
print(f"ファイル名(拡張子なし): {name_without_ext}")
print(f"拡張子: {extension}")
# 複数のドットがある場合の例
complex_filename = "backup.2024.01.15.tar.gz"
simple_split = complex_filename.rsplit('.', 1)[0]
print(f"複雑なファイル名の処理結果: {simple_split}")
【実行結果】
ファイル名(拡張子なし): report
拡張子: .pdf
複雑なファイル名の処理結果: backup.2024.01.15.tar
rsplit()メソッドは、第1引数に区切り文字、第2引数に分割回数を指定します。
右側から1回だけ分割することで、最後の拡張子のみを取り除くことができます。
複数のドットが含まれるファイル名でも、この方法なら最後の拡張子だけを正確に分離できるでしょう。
ただし、拡張子が存在しない場合の処理を適切に行う必要があります。
上記のコードでは、ドットが含まれているかを事前にチェックしているため、エラーを避けられます。
pathlibモジュールで拡張子なしのファイル名を取得する方法
Python 3.4以降で導入されたpathlib
モジュールは、よりオブジェクト指向的なアプローチでパス操作を行えます。
直感的で読みやすいコードが書けるため、近年では推奨される方法となっています。
Pathオブジェクトの.stem属性を使う
pathlib.Pathオブジェクトの.stem属性を使用する方法が、最もシンプルでしょう。
from pathlib import Path
# ファイルパスの例
file_path = "/home/user/documents/example.txt"
# Pathオブジェクトを作成
path_obj = Path(file_path)
# .stem属性で拡張子なしのファイル名を取得
filename_without_ext = path_obj.stem
print(f"ファイル名(拡張子なし): {filename_without_ext}")
print(f"拡張子: {path_obj.suffix}")
print(f"完全なファイル名: {path_obj.name}")
# より複雑なパスでの例
complex_path = Path("/var/log/system.2024.log")
print(f"複雑なパスの処理結果: {complex_path.stem}")
# 相対パスでの例
relative_path = Path("data/config.json")
print(f"相対パスの処理結果: {relative_path.stem}")
【実行結果】
ファイル名(拡張子なし): example
拡張子: .txt
完全なファイル名: example.txt
複雑なパスの処理結果: system.2024
相対パスの処理結果: config
.stem属性は、ファイル名から拡張子を取り除いた部分を返します。
非常にシンプルで分かりやすく、コードの可読性も高くなるでしょう。
.nameと.suffixの組み合わせ
別のアプローチとして、.name属性と.suffix属性を組み合わせる方法もあります。
from pathlib import Path
# ファイルパスの例
file_paths = [
"/home/user/documents/presentation.pptx",
"/tmp/archive.tar.gz",
"/etc/hosts", # 拡張子なしのファイル
"/data/backup.2024.sql"
]
for file_path in file_paths:
path_obj = Path(file_path)
# .nameから.suffixを除去する方法
if path_obj.suffix:
name_without_ext = path_obj.name.replace(path_obj.suffix, '')
else:
name_without_ext = path_obj.name
print(f"元のパス: {file_path}")
print(f"ファイル名(拡張子なし): {name_without_ext}")
print(f"参考 - .stem属性: {path_obj.stem}")
print("---")
【実行結果】
元のパス: /home/user/documents/presentation.pptx
ファイル名(拡張子なし): presentation
参考 - .stem属性: presentation
---
元のパス: /tmp/archive.tar.gz
ファイル名(拡張子なし): archive.tar
参考 - .stem属性: archive.tar
---
元のパス: /etc/hosts
ファイル名(拡張子なし): hosts
参考 - .stem属性: hosts
---
元のパス: /data/backup.2024.sql
ファイル名(拡張子なし): backup.2024
参考 - .stem属性: backup.2024
---
この方法は.stem属性とほぼ同じ結果を得られますが、より冗長になってしまいます。
通常は.stem属性を使用する方が効率的でしょう。
ただし、特別な処理が必要な場合には、このような細かい制御も可能だということを覚えておいてください。
まとめ
以上、Pythonで拡張子なしのファイル名を取得する方法について、主要な4つのアプローチを紹介しました。
なお、Pythonを体系的に学んだり、Pythonのスキルを高めたりするためには、プログラミングスクールを利用するのも有効です。
細かな疑問がすぐに解決するだけでなく、現役エンジニアが「質の高いポートフォリオ」を作成するための手助けをしてくれたり、エンジニア就職・転職のコツを教えてくれたりするなど、様々なメリットがありますので、独学に疲れた方は検討してみてはいかがでしょうか。
