Pythonで同じディレクトリにあるファイルを開く(path.dirname(__file__)とpath.joinを使う)
Python で同じディレクトリにあるファイルを開くには、os の path ライブラリを使う。
あるディレクトリに a.txt と b.py があり、b.py で a.txt を開くとする。
from os import path
a = path.join(path.dirname(__file__), 'a.txt')
with open(a, 'r') as f:
s = f.read().splitlines()
print(s)
注意
相対パスは注意が必要で、open の第一引数を a.txt と単に指定してもうまくいかない。つまり下のコードはエラーになる。
with open('a.txt', 'r') as f:
s = f.read().splitlines()
path.dirname
Python ファイルのあるディレクトリの絶対パスは
path.dirname(__file__)
で取得する。上の例では b.py のあるディレクトリの絶対パスが返る。ファイルの絶対パスでなく、ファイルのあるディレクトリの絶対パスである。例えば
/Users/irohabook/PycharmProjects/sample
といった文字列が返る。最後はスラッシュがない。
path.join
path.join はパスを結合する。最初のコードをもう一度見よう。
from os import path
a = path.join(path.dirname(__file__), 'a.txt')
with open(a, 'r') as f:
s = f.read().splitlines()
print(s)
path.join の引数は a.txt となっている。先頭にスラッシュがついていない。スラッシュをつけるとエラーになる。
参考 Why doesn't os.path.join() work in this case? - stackoverflow
他に知っておくと便利なポイント
しつこく最初のコードをふりかえる。f.read().splitlines() に注目しよう。
from os import path
a = path.join(path.dirname(__file__), 'a.txt')
with open(a, 'r') as f:
s = f.read().splitlines()
print(s)
なぜ f.read().splitlines() とわざわざしているのか? readlines() をなぜ使わないか?
C# といった他の言語にある readlines は Python にもあるが、改行コードがリストの要素に含まれてしまう。例えば a.txt に次のデータがあったとしよう。
apple
amazon
google
facebook
a.txt を readlines() で読みこむ。
from os import path
a = path.join(path.dirname(__file__), 'a.txt')
with open(a, 'r') as f:
s = f.readlines()
print(s)
結果はこうなる。
['apple\n', 'amazon\n', 'google\n', 'facebook']
不要な改行コードを最初から除去する素朴な方法は f.read().splitlines() である。