【python】ファイルパスをフォルダパス・ファイル名・拡張子に分割する[osライブラリ]

2020年3月31日

ファイルパスを使いやすい形に加工したい場合はosライブラリを使用しましょう。
ファイルパスはフォルダパス・ファイル名・拡張子で構成されてるので、それぞれを取得したい場合に使用できます。

ファイルパスからフォルダパス・ファイル名を分割する

下記はフォルダパスとファイル名を分割後に配列に格納して戻り値として返却する関数です。

def pathSplitDB( path ):
    import os.path

    dir = os.path.dirname(path)
    basename = os.path.basename(path)

    return [dir,basename]

1行目:分割したいファイルパスを引数にしています。
4行目:os.path.dirname()・・・ファイルパスからフォルダパスを取り出す関数
5行目:os.path.basename() ・・・ファイルパスからファイル名を取り出す関数
7行目:配列にフォルダパスとファイル名を格納して返却

下記は上記関数「pathSplitDB」の実行関数です。

def sample1():
    import os.path

    #ローカルパスからファイル名を取り出す
    path = 'c:/dir/test1.txt'
    print( "分割 :", path )      #分割 : c:/dir/test1.txt
    print( pathSplitDB(path) )   #['c:/dir', 'test1.txt']

    #ネットワークパスからファイル名を取り出す
    path = r'\\ABCBE\Users\test2.txt'
    print( "分割 :", path )      #分割 : \\ABCBE\Users\test2.txt
    print( pathSplitDB(path) )   #['\\\\ABCBE\\Users\\', 'test2.txt']

    #拡張子が無い場合
    path = 'c:/dir/test'
    print( "分割 :", path )      #分割 : c:/dir/test
    print( pathSplitDB(path) )   #['c:/dir', 'test']

4-7行目 : 
 cドライブ内のフォルダパスを分割します。
 一番一般的な形のファイル名ではないでしょうか。

9-12 行目 : 
 ネットワークパスから分割します。
 フォルダパス分割担当は関数「os.path.dirname()」です。
 \\から始まるネットワークパスでも フォルダパス抽出は上手くいきます。

14-17行目 : 
 拡張子が無い場合の分割。
 ファイルパス取得担当は関数「os.path.basename()」です。
 拡張子が無かった場合でも抽出は可能です。

ファイルパスからフォルダパス・ファイル名(拡張子無し)・拡張子を取り出す

これまでの関数を少し改造すると フォルダパス・ファイル名(拡張子無し)・拡張子の3種類に分割可能です。分割後に1つの配列にまとめます。

def pathSplitDFE(path):
    import os.path

    dir = os.path.dirname(path)
    basename = os.path.basename(path)
    file , ext = os.path.splitext( basename )

    return [dir,file,ext[1:]]

1行目:分割したいファイルパスを引数にしています。
4行目:ファイルパスからファイルまでのフォルダパスを取得。
5行目:ファイルパスからファイル名を抽出。
6行目:ファイル名(拡張子有り)を ファイル名(拡張子無し)と拡張子に分離します。
8行目:フォルダパス・ ファイル名(拡張子無し)・拡張子の3つを配列に格納して返却する。
   ext[1:]・・・取得した拡張子は先頭にドット[.]が付くため、スライスにて除去を行う。
   例).txt → txt
     .jpg → jpg

下記は上記関数「pathSplitDFE」の実行関数です。

def sample2():
    import os.path

    #ローカルパスを分割する
    path = 'c:/dir/test1.txt'
    print( "分割 :", path )      #分割 : c:/dir/test1.txt
    print( pathSplitDFE(path) )  #['c:/dir', 'test1', 'txt']

    #ネットワークパスを分割する
    path = r'\\ABCBE\Users\test2.txt'
    print( "分割 :", path )      #分割 : \\ABCBE\Users\test2.txt
    print( pathSplitDFE(path) )  #['\\\\ABCBE\\Users\\', 'test2', 'txt']

    #拡張子が無い場合
    path = 'c:/dir/test'
    print( "分割 :", path )      #分割 : c:/dir/test
    print( pathSplitDFE(path) )  #['c:/dir', 'test', '']

4-7行目: cドライブ内のローカルパスからフォルダパス・ファイル名(拡張子無し)・拡張子を取り出す。
9-12 行目:ネットワークパスからフォルダパス・ファイル名(拡張子無し)・拡張子を取り出す。
14-17行目:拡張子が無い場合は分割。拡張子を格納する配列の3つ目は空欄になります。

ソースコードはこちらから