(最終更新月:2023年6月)
✔このような方へ向けて書かれた記事となります
「Pythonでファイル名を取得する方法を知りたい」
「Pythonでファイル名を操作する方法を理解したい」
「Pythonによるファイル名取得の実例が見たい」
✔当記事を通じてお伝えすること
- Pythonを用いたファイル名取得の基本
- Pythonでのファイル名取得や操作の手法
- ファイル名取得を実現するPythonのコード例
当記事では、Pythonを使ったファイル名取得の基本から、そのさまざまな手法や応用まで、具体的なコード例を交えて詳細に解説しています。
ぜひ最後までご覧ください。
osモジュールを用いた基本的な方法
まず最初に、Pythonのosモジュールを用いてファイル名を取得する基本的な方法についてお伝えします。
osモジュールは、オペレーティングシステムと対話するための機能を提供しており、ファイルやディレクトリに関する情報の取得や操作が可能です。
- オペレーティングシステムの違いに対応する方法
- os.path.basename()でファイル名取得
- 拡張子ありのファイル名の取得、拡張子なしのファイル名の取得
- os.path.dirname()でフォルダ名取得
- os.path.split()でファイル名とフォルダ名のペア取得
- os.path.splitext()で拡張子取得と変更
- os.path.join()でファイル名とフォルダ名を結合
オペレーティングシステムの違いに対応する方法
Pythonのosモジュールは、Pythonが動作するさまざまなオペレーティングシステム(Windows、macOS、Linuxなど)で使用できます。
なぜなら各システムで異なるパスの表記法を、osモジュールの関数で吸収できるからです。
例えば、os.pathモジュールのos.path.join関数は、システムに適した形式でパスを結合します。
import os
path = os.path.join("folder1", "folder2", "file.txt")
print(path) # "folder1/folder2/file.txt" on Unix, "folder1\\folder2\\file.txt" on Windows
osモジュールを使えば、異なるオペレーティングシステムでも同じコードでパスの操作を行うことが可能です。
os.path.basename()でファイル名取得
os.path.basename関数は、指定したパスの最後の部分(一般的にはファイル名)を返します。
以下がその具体例です。
import os
path = "/path/to/file.txt"
filename = os.path.basename(path)
print(filename) # Output: "file.txt"
この関数はパスの末尾に位置するファイル名を取り出すのに便利で、パスからファイル名部分だけを抽出する場合に使用します。
拡張子ありのファイル名の取得、拡張子なしのファイル名の取得
os.path.basename関数は、ファイル名をそのまま返すため、拡張子も一緒に取得されます。
拡張子なしのファイル名だけを取得したい場合は、さらにos.path.splitext関数を使用してください。
import os
path = "/path/to/file.txt"
filename_with_ext = os.path.basename(path)
filename_without_ext = os.path.splitext(filename_with_ext)[0]
print(filename_with_ext) # Output: "file.txt"
print(filename_without_ext) # Output: "file"
os.path.splitext関数は、ファイル名を「拡張子なしの部分」と「拡張子」の2つに分割して、タプルとして返すものです。
os.path.dirname()でフォルダ名取得
os.path.dirname関数は、指定したパスの末尾を除いた、それ以前の部分(一般的にはディレクトリパス)を返します。
import os
path = "/path/to/file.txt"
dirpath = os.path.dirname(path)
print(dirpath)
# 出力結果: "/path/to"
os.path.basename関数とos.path.dirname関数を組み合わせることで、ファイル名とフォルダ名を分けて取得できます。
os.path.split()でファイル名とフォルダ名のペア取得
os.path.split関数は、指定したパスを「ディレクトリ部分」と「最後の部分」(通常はファイル名)に分けるもの。
分けた後、タプルとして返してくれます。
import os
path = "/path/to/file.txt"
dirpath, filename = os.path.split(path)
print(dirpath) # 出力: "/path/to"
print(filename) # 出力: "file.txt"
os.path.split関数は、os.path.dirname関数とos.path.basename関数の機能を一度におこなえる関数といえるでしょう。
os.path.splitext()で拡張子取得と変更
os.path.splitext関数は、指定したパスを「拡張子以外の部分」と「拡張子」に分割して、それらをタプルとして返すもの。
この関数は、ファイル名に含まれるドットの最後のものを拡張子の区切りと判断しています。
import os
path = "/path/to/file.txt"
root, ext = os.path.splitext(path)
print(root) # Output: "/path/to/file"
print(ext) # Output: ".txt"
拡張子を変更したい場合は、この関数で拡張子を分割してから、新しい拡張子を追加しましょう。
new_path = root + ".jpg"
print(new_path) # Output: "/path/to/file.jpg"
tar.gzのような複合拡張子の場合でも、os.path.splitext関数は正しく動作します。
path = "/path/to/file.tar.gz"
root, ext = os.path.splitext(path)
print(root) # Output: "/path/to/file.tar"
print(ext) # Output: ".gz"
os.path.join()でファイル名とフォルダ名を結合
os.path.join関数は、指定した複数のパスを連結してひとつのパスにする関数です。
この関数により、オペレーティングシステムに適した区切り文字(Linux、macOSではスラッシュ「/」、Windowsではバックスラッシュ「\」)を使用したパスが作成できます。
import os
dirname = "/path/to"
filename = "file.txt"
path = os.path.join(dirname, filename)
print(path) # Output: "/path/to/file.txt"
より便利なファイル名取得のためのglobモジュール活用法
ここでは、globモジュールを用いたファイル名取得の方法について説明します。
globモジュールは、特定のパターンにマッチするファイルやフォルダ名を取得するのに便利なツールです。
- globモジュールの基本
- globモジュールでファイル名やフォルダ名一覧を取得
- globモジュールで再帰的にファイルパスやフォルダパス一覧を取得
globモジュールの基本
globモジュールの主な関数はglob関数。
特定のパターンにマッチするファイル名やフォルダ名のリストを返すものです。
パターンでは、ワイルドカード(*)や?(任意の一文字)などが使えます。
import glob
files = glob.glob("/path/to/*.txt")
print(files) # Output: ['/path/to/file1.txt', '/path/to/file2.txt', ...]
指定したパス(’/path/to/’)に存在する.txt拡張子を持つ全てのファイルのリストを取得しています。
globモジュールでファイル名やフォルダ名一覧を取得
ファイルのみ、またはフォルダのみの一覧を取得したい場合は、osモジュールと組み合わせましょう。
なぜならglob関数は、指定したパスにマッチする全ファイルとフォルダの一覧を取得するものだからです。
以下の例では、glob.globで取得した一覧から、os.path.isdir関数を用いてディレクトリのみをフィルタリングしています。
import os
import glob
path = "/path/to/*"
all_files_and_dirs = glob.glob(path)
dirs = [d for d in all_files_and_dirs if os.path.isdir(d)]
print(dirs) # 出力結果: ['/path/to/dir1', '/path/to/dir2', ...]
同様に、os.path.isfile関数を用いてファイルのみをフィルタリングすることもできます。
globモジュールで再帰的にファイルパスやフォルダパス一覧を取得
globモジュールは、再帰的なパス検索もサポートしています。
再帰的な検索には、recursive引数をTrueにしましょう。
import glob
files = glob.glob("/path/to/*/.txt", recursive=True)
print(files) # Output: ['/path/to/file1.txt', '/path/to/subdir/file2.txt', …]
指定したパス(’/path/to/’)およびそのサブディレクトリに存在する.txt拡張子を持つ全てのファイルのリストを取得しています。
pathlibモジュールでシンプルなファイル名操作
次に、Pythonの標準ライブラリの一つであるpathlibモジュールを用いた方法について説明します。
pathlibは、ファイルシステムパスに対するさまざまな操作を提供するオブジェクト指向のライブラリです。
- pathlib概要とメリット
- ファイル名取得のための.nameプロパティ
- ファイルのコピー・移動の例
pathlib概要とメリット
pathlibモジュールは、パス操作をより直感的に、よりシンプルにおこなえるツールを提供します。
パス操作を行うためのメソッドやプロパティが豊富に揃っており、パスオブジェクトとしての操作が可能です。
またpathlibでは、OS非依存のコードを書けるのも特徴といえます。
例えば、WindowsとUNIX系のシステムでは、パスの区切り文字が異なりますが、pathlibはこの違いを吸収してくれるのです。
from pathlib import Path
p = Path('/path/to/file.txt')
print(p.name) # Output: 'file.txt'
上記のコードでは、Pathオブジェクトを作成し、.nameプロパティを使用してファイル名を取得しています。
ファイル名取得のための.nameプロパティ
pathlibのPathオブジェクトには、ファイル名やディレクトリ名を取得するためのプロパティが用意されています。
.nameプロパティを使用すると、パスの末尾(ファイル名やディレクトリ名)を取得できるのです。
from pathlib import Path
p = Path('/path/to/file.txt')
print(p.name) # 出力: 'file.txt'
.nameプロパティを使用してファイル名 ‘file.txt’ を取得しています。
ファイルのコピー・移動の例
pathlibモジュールを使用すれば、ファイルのコピー・移動も容易です。
以下に、Pathオブジェクトの .replace() メソッドを使用したファイルの移動の例を示します。
from pathlib import Path
from shutil import copy2
src = Path('/path/to/src.txt')
dst = Path('/path/to/dest.txt')
# コピー
copy2(src, dst)
# 移動
dst = src.replace('/path/to/dest.txt')
具体的には以下をおこなっています。
- shutil モジュールの copy2 関数を使用して、ファイルをコピー
- Pathオブジェクトの .replace() メソッドを使用してファイルを移動
異なるOSのフォーマット対応(Windowsの場合)
次に、Windowsのパス形式について説明します。
Windowsではパスの区切り文字にバックスラッシュ(\)が使われますが、これはPythonのエスケープシーケンスと衝突するため注意が必要です。
- 区切り文字バックスラッシュとraw文字列
- ドライブ文字の取得・結合: os.path.splitdrive()
区切り文字バックスラッシュとraw文字列
Windowsのパスにはバックスラッシュ(\)が含まれますが、Pythonではバックスラッシュがエスケープシーケンスの一部として解釈されるため、そのままではパスとして正しく認識されません。
そのため、Windowsのパスを扱う際には、バックスラッシュを二重にするか、raw文字列(r’…’)を用いると便利です。
path = 'C:\\path\\to\\file.txt' # バックスラッシュを二重に
path = r'C:\path\to\file.txt' # raw文字列を用いる
上記のどちらの方法でも、Pythonは正しくパスを認識します。
ドライブ文字の取得・結合: os.path.splitdrive()
Windowsのパスには、通常ドライブ文字(例:’C:’)が含まれます。
このドライブ文字を取得したり、パスに追加するためには、os.pathモジュールのsplitdrive関数とjoin関数を使用しましょう。
import os
path = 'C:\\path\\to\\file.txt'
drive, rest = os.path.splitdrive(path)
print(drive) # Output: 'C:'
print(rest) # Output: '\\path\\to\\file.txt'
os.path.splitdrive関数を使用してドライブ文字とそれ以外のパスを分割しています。
分割した結果は2つの部分(ドライブ文字とパス)で、これらを再度結合するためにはos.path.join関数を使用してください。
まとめ
当記事では、Pythonを用いてファイル名やフォルダ名を取得するための方法について学習してきました。
- osモジュールを用いた基本的な方法
- より便利なファイル名取得のためのglobモジュール活用法
- pathlibモジュールでシンプルなファイル名操作
- 異なるOSのフォーマット対応(Windowsの場合)
osモジュールの基本的な関数を使用した基本的な方法から、globモジュールやpathlibモジュールを活用したより高度な手法まで、さまざまな方法が存在します。
また、pathlibモジュールを使用することで、より直感的にファイルパスを操作することが可能です。
Windowsではパスの区切り文字やドライブ文字が特殊な形式を取るため、注意が必要。
これらの知識を組み合わせ、あらゆるニーズに対応したファイル名取得や操作を実現してください。
ぜひ、自分のニーズに合った最適な手法を選択し、効率的なコーディングを目指しましょう。