Pythonプログラムをファイルに書き込んでテストする際
「 実行パスがファイルのある場所と違う 場合」に起こる不具合の対処法です。
不具合の例
-
open()
を使用するなどしてファイルを操作する場合に、
ファイルを使用できない。あるいは、書き込み時にエラーを吐く。 -
import
を使用して自作のpythonファイルを呼び出そうとするが
読み込まれない。 - 上記いずれかが VSCODEのみ で発生する
原因と対策
VSCODE では
「Python を実行しているフォルダ( 以降 カレント と呼ぶ )」が
「Python の実行ファイルのあるフォルダ( 以降 ファイルパス と呼ぶ )」と違う場合があります。
[ディレクトリ構造の例]
root/
┣━ フォルダ1/ #カレント
┗━ フォルダ2/ #ファイルパス
┣━ 実行ファイル.py
┣━ module.py
┗━ example.txt
このファイルパスとカレントが違う場合。
Python は呼び出そうとするファイル名( example.txt
など )を、そのまま記述すると
カレント からファイルを探そうとします。
当然場所が違うわけですからファイルパス にある
「module.py
」や「example.txt
」は読み込まれません。
そこで本格的な処理を始める前に
カレント と ファイルパス を同じ場所にしてあげる必要があります。
実際のコード
python current.py
import os
current = __file__
current = current.split("\\")
current.pop()
current = "\\".join(current)+"\\"
os.chdir(current)
-
__file__
: これは予約語と呼ばれる変数の一つで、ここに実行ファイルの 絶対パス が格納されます。
絶対パスはC://
やhttps://
など、これ以上さかのぼれない場所 からファイル名を記述する方法で、この方法で記述する場合はパスの間違いは起こりません。 -
os.chidr()
: これはカレントの位置を移動させる関数です。
__file__
から実行ファイルの絶対パスを取得して、ファイル名のみを.pop()
で削除して、os.chdir()
を使ってパスを指定してあげることで、カレント を ファイルパス と同じ位置に移動させることが出来ます。
もうちょっと うまい書き方があった気がす...