今日はなにの日。

気になったこと勉強になったことのメモ。

今日は、Pythonでファイル操作するときの助けの日。

目次

とある日

Pythonや他の言語でも実装するとファイル参照などのときに手間が減るかもしれない方法。

No such file or directory

ファイル読み込みなどのプログラムを書いているとPATHが間違ってそんなファイルは存在しないというエラーをみたことがある人は多いだろう。

各有自分もよくやっていた。

今回はそのエラーを回避する方法を記述する。

エラー原因

今回エラー回避できるFileNotFoundErrorについて少し補足します。

今回の手法で回避エラー原因はカレントディレクトリと実行ファイル内の読み込みファイルのPATHに差異があるため発生するエラーに関してのみ回避することができます。

詳しく説明すると。

下記のようなディレクトリ構造になっている場合。

C:.
├─Current_Directory
└─python
        python.py
        read.txt

そして、python.pyには下記のようなread.txtを読み込むような記述があった場合。

with open("./read.txt", mode="r", encoding="utf-8") as f:
    l = f.readlines()

pyhonディレクトリでpython.pyを実行すると問題なくread.txtを読み込む事が可能です。

しかし、Current_Directoryに移動して実行するとFileNotFoundError: [Errno 2] No such file or directoryが出力されます。

これを回避する方法があるのです。

Change Directory

方法は簡単下記の関数を導入して呼び出すだけ。

import os
def cd():
    os.chdir(os.path.dirname(__file__))

少し解説。

python.pyに当てはめて考えます。

名称 意味
__file__ 実行中のファイルの場所(パス)を取得する C/python/python.py
os.path.dirname フォルダ名(ディレクトリ名)を取得する C/python
os.chdir カレントディレクトリを変更 C/python

文章で説明すると、__file__で実行ファイルの絶対PATHを取得して、そのPATHをもとにそのファイル格納フォルダのディレクトリをos.path.dirname で取得。

最後に、そのディレクトリにos.chdirで移動するといった内容。

これをすることによって、カレントディレクトリを気にすることなく、ファイルを実行することができる。

考えるのは、実行ファイルから読み込むファイルの相対パスのみ。

全体像

import os


def cd():
    os.chdir(os.path.dirname(__file__))


if __name__ == "__main__":
    cd()

    with open("./read.txt", mode="r", encoding="utf-8") as f:
        l = f.readlines()

ファイル読み込みの前に実行する必要がある。

簡単な内容ですが、これをすることによって毎回カレントディレクトリを変更する必要がなくなるので少し便利になります。

VSCodeだと、スニペットが登録できるのでcdなどで登録しておくと、毎回記述する手間やコピーする手間が省けます。