[解決済み] Pythonプロジェクトで相対パスを使ってファイルを読み込む
2022-11-13 05:17:07
質問
以下のような構成のPythonプロジェクトがあるとします。
project
/data
test.csv
/package
__init__.py
module.py
main.py
__init__.py
:
from .module import test
module.py
:
import csv
with open("..data/test.csv") as f:
test = [line for line in csv.reader(f)]
main.py
:
import package
print(package.test)
を実行すると
main.py
というエラーが出ます。
C:\Users\Patrick\Desktop\project>python main.py
Traceback (most recent call last):
File "main.py", line 1, in <module>
import package
File "C:\Users\Patrick\Desktop\project\package\__init__.py", line 1, in <module>
from .module import test
File "C:\Users\Patrick\Desktop\project\package\module.py", line 3, in <module>
with open("../data/test.csv") as f:
FileNotFoundError: [Errno 2] No such file or directory: '../data/test.csv'
しかし、もし私が
module.py
を実行すると
package
ディレクトリに移動しても、エラーは発生しません。ということは、どうやら
open(...)
で使用される相対パスは、元のファイルが実行されている場所からの相対パスでしかないようです (すなわち
__name__ == "__main__"
)? 絶対パスは使いたくありません。これに対処する方法は何かありますか?
どのように解決するのですか?
相対パスは 現在の作業ディレクトリ . 相対パスが必要でない場合は、絶対パスでなければなりません。
しかし、現在のスクリプトから絶対パスを作成するために、よく使われるトリックがあります。
__file__
という特殊な属性を使うことです。
from pathlib import Path
path = Path(__file__).parent / "../data/test.csv"
with path.open() as f:
test = list(csv.reader(f))
Python 3.4+が必要です( パスライブラリ モジュールのため) が必要です。
まだ古いバージョンに対応する必要がある場合は、次のようにすると同じ結果になります。
import csv
import os.path
my_path = os.path.abspath(os.path.dirname(__file__))
path = os.path.join(my_path, "../data/test.csv")
with open(path) as f:
test = list(csv.reader(f))
[ 2020年版の編集です。 python3.4+が当たり前になったはずなので、jpyamsさんのコメントに触発されてpathlib版を先に移動しました] 。
関連
-
[解決済み] __init__.py でも「非パッケージで相対的なインポートを試みた」を修正する方法
-
[解決済み] ファイルのコピー方法について教えてください。
-
[解決済み] Pythonでファイルやフォルダを削除する方法は?
-
[解決済み] なぜC++はPythonよりもstdinからの行の読み込みが遅いのですか?
-
[解決済み] os/path 形式に関係なく、パスからファイル名を抽出します。
-
[解決済み] Pythonでファイルの絶対パスを取得する方法
-
[解決済み] 相対パスからモジュールをインポートする
-
[解決済み] Pythonで相対インポートを行うには?
-
[解決済み】Python 3での相対インポート
-
[解決済み】典型的なテストディレクトリ構造でunittestを実行する
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] googletransがエラー 'NoneType' オブジェクトに 'group' 属性がない、と言って動かなくなった。
-
[解決済み] Python 2.7サポート終了?
-
[解決済み] PythonからSMTPを使用してメールを送信する
-
[解決済み] 文字列のリストを内容に基づいてフィルタリングする
-
[解決済み] スペースがないテキストを単語のリストに分割する方法
-
[解決済み] オブジェクトのリストに特定の属性値を持つオブジェクトが含まれているかどうかをチェックする
-
[解決済み] あるオブジェクトが数であるかどうかを確認する、最もパイソン的な方法は何でしょうか?
-
[解決済み] Flaskで非同期タスクを作る
-
[解決済み] Pythonの文字列の前にあるbという接頭辞は何を意味するのですか?
-
[解決済み] Python の sorted() はどのようなアルゴリズムを使っているのですか?重複