New サムネイル 鎌倉時代の元号一覧(西暦と和暦の対応表と読み方) New サムネイル pandasでDataFrameをcsvファイルに書き出す(to_csv):インデックスのありな New サムネイル pandasで条件に合う行を選択する(locの使い方と条件のand)

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() である。

広告

広告

広告

コンピューター コンピューター
プログラミング プログラミング
数学 数学
英語 英語
国語 国語
理科 理科
社会 社会

Python入門

Python入門

化学入門

化学入門

漢字辞典

漢字辞典

整数辞典

漢字辞典

Lord Candy

Lord Candy