[Python]openしているファイルオブジェクトのファイル名を取得する

2019年11月29日

小ネタです。
ファイルを扱う処理で、ファイル名によって分岐させたいときがありました。
結論から言うとファイルオブジェクトのnameメンバにアクセスすれば取得できます。

具体的には、

filepath = 'xxx'
with open(filepath, 'r') as fr:
    do_something(fr)

def do_something(f):
    # なにか処理
    pass

上記でなにか処理しているdo_something()の中でファイル名が知りたいとき、
fr.name
であっさり取得できます。

> fp = 'wine.csv'
> d = open(fp, 'r')
> d.name
'wine.csv'

pathlibのopenでも同様です。

> import pathlib
> fp = 'wiine.csv'
> d = pathlib.Path(fp)
> f_obj = d.open()
> f_obj.name
'wine.csv'

サンプルコード

※同ディレクトリにwine.csvというファイルがある想定です。

import pathlib

def do_something(f_obj):
    print('filepath is:', f_obj.name)

    for line in f_obj:
        print(line)


filepath = 'wine.csv'

# 組み込み関数
with open(filepath, 'r') as fr:
    print('組み込み関数 open():')
    do_something(fr)


# pathlib版
p_obj = pathlib.Path(filepath)
with p_obj.open() as f:
    print('Pathlib open():')
    do_something(f)

実行結果

組み込み関数 open():
filepath is: wine.csv
"","OBS","VINT","LPRICE2","WRAIN","DEGREES","HRAIN","TIME_SV"
"1",1,1952,-0.99868,600,17.1167,160,31
"2",2,1953,-0.4544,690,16.7333,80,30
"3",3,1954,NA,430,15.3833,180,29
... (省略)
Pathlib open():
filepath is: wine.csv
"","OBS","VINT","LPRICE2","WRAIN","DEGREES","HRAIN","TIME_SV"
"1",1,1952,-0.99868,600,17.1167,160,31
"2",2,1953,-0.4544,690,16.7333,80,30
"3",3,1954,NA,430,15.3833,180,29
... (省略)

まとめ

当たり前かもしれませんが便利です。
知らずに自前で引数渡すことになりかねなかったので、助かりました。

参考