Pythonでファイルパスを扱う際、スラッシュ(/
)とバックスラッシュ(\\
)の違いは重要な問題となります。特に、glob
モジュールを使用してワイルドカードを含むパスを扱うとき、この問題はより顕著になります。
globモジュールとパスの区切り文字
glob
モジュールは、ワイルドカードを含むパスを扱うためのPythonの標準ライブラリです。しかし、Windows環境では、パスの区切り文字がバックスラッシュ(\\
)となります。これは、glob
モジュールが内部でパスを分割し結合する際、ワイルドカードの前後の結合時に区切りがバックスラッシュ(\\
)になってしまうという仕様から来ています。
この仕様により、以下のようなコードを実行すると、意図しない結果を得ることがあります。
import glob
path_target = "C:/Users/user/Desktop/testfolder/*"
files = glob.glob(path_target)
print(files) # ['C:\\Users\\user\\Desktop\\testfolder\\file1.txt', 'C:\\Users\\user\\Desktop\\testfolder\\file2.txt', ...]
この例では、glob.glob
関数が返すファイルパスの区切り文字がバックスラッシュ(\\
)となってしまいます。
対処法
この問題を解決するための一般的な対処法は以下の3つです。
- パス文字列を生成する際に
os.path.join
を使用する。 - パスの区切り文字をバックスラッシュ(
\\
)からスラッシュ(/
)に置換する。 - パス文字列をraw文字列として扱う。
以下にそれぞれの対処法を用いた例を示します。
import os
import glob
# 対処法1: os.path.joinを使用する
path_target = os.path.join("C:", "Users", "user", "Desktop", "testfolder", "*")
files = glob.glob(path_target)
print(files) # ['C:/Users/user/Desktop/testfolder/file1.txt', 'C:/Users/user/Desktop/testfolder/file2.txt', ...]
# 対処法2: バックスラッシュをスラッシュに置換する
path_target = "C:/Users/user/Desktop/testfolder/*"
files = glob.glob(path_target)
files = [x.replace("\\", "/") for x in files]
print(files) # ['C:/Users/user/Desktop/testfolder/file1.txt', 'C:/Users/user/Desktop/testfolder/file2.txt', ...]
# 対処法3: raw文字列を使用する
path_target = r"C:\Users\user\Desktop\testfolder\*"
files = glob.glob(path_target)
print(files) # ['C:\\Users\\user\\Desktop\\testfolder\\file1.txt', 'C:\\Users\\user\\Desktop\\testfolder\\file2.txt', ...]
これらの対処法を適切に使用することで、Pythonのglob
モジュールを用いてもパスの区切り文字に起因する問題を避けることができます。特に、異なるOS間でのコードの互換性を保つためには、パスの区切り文字をスラッシュ(/
)に統一することが推奨されます。