質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Q&A

解決済

3回答

898閲覧

dataのimportができません…助けて!

0910pass.py

総合スコア33

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

0グッド

0クリップ

投稿2019/07/20 13:46

前提・実現したいこと

迷路の出力

##過程
クジラ飛行机さんのゼロからやさしくはじめるpython入門という本に基づいて

data=[
[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],
[1,2,0,0,1,0,0,0,1,0,0,1,0,0,0,1,0,0,1],
[1,0,1,0,1,1,1,0,0,0,0,0,0,1,0,0,0,1,1],
[1,0,1,0,0,0,0,0,1,1,1,1,1,1,1,1,0,0,1],
[1,0,1,0,0,0,1,0,0,0,0,1,0,1,0,1,0,0,1],
[1,0,0,0,1,1,1,1,1,1,0,1,0,0,0,0,1,1,1],
[1,0,1,0,1,0,0,1,0,0,0,1,0,0,1,0,0,0,1],
[1,0,1,0,0,1,1,1,0,1,0,1,0,1,1,0,1,1,1],
[1,0,1,0,1,0,0,0,0,1,0,0,0,1,0,0,0,3,1],
[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],
]
をテキストエディタに入力、名前をmaru_data
として保存、その後に
from tkinter import*

tile_size=20

def load_map_data():
from maru_data import data
return data

def draw_map(cv,data):
rows=len(data)
cols=len(data[0])
for y in range(rows):
y1=y*y * tile_size
y2=y1+ tile_size

for x in range(cols): x1=x*tile_size x2=x1+tile_size p=data[y][x] if p==0:color="white" if p==1:color="#404040" if p==2:color="red" if p==3:color="blue" cv.create_rectangle( x1,y1,x2,y2, fill=color, outline="black",width=2)

def create_window(map_data,events=[]):
win=Tk()
win.title("迷路")
rows=len(map_data)
cols=len(map_data[0])
cv=Canvas(win,
width=(colstile_size),
height=(rows
tile_size))

cv.pack() draw_map(cv,map_data) for func in events: func(cv,map_data) win.mainloop()

if name=="main":
map_data=load_map_data()
create_window(map_data)

を別のテキストエディタに入力名前をmiとし
、即実行すると…

以下のエラーメッセージが発生しました。

発生している問題・エラーメッセージ

File "C:\Users\Maruyama\AppData\Local\Programs\Python\Python37\mi.py", line 6, in load_map_data
from maru_data import data
ModuleNotFoundError: No module named 'maru_data'

言語はもちろんpythonを使用しています。
ソースコード

### 試したこと 1maru_dataファイルの名前の変更 2pythonとmaru_dataファイルのクレントディレクタの一致化

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

LouiS0616

2019/07/20 14:07

1. marudataはどこに保存したのですか。 2. 『marudata.py』ではなく『marudata』という名前で保存したのですか。 3. どのように実行していますか。
0910pass.py

2019/07/20 14:19

コメントありがとうございます! 1 my computerの C:\Users\MARUYAMA\Pictures\116_0320に保存しました。 2maru_dataで保存しました。 3maru_dataの保存後、すぐにmiを入力し、入力完了の画面の[run]をクリックし、 そこの[run module]をクリックし、実行しました。 いかがでしょうか…?
LouiS0616

2019/07/20 14:37 編集

1と2は不適切な方法であるように思います。 3については把握しました。IDLEをご利用なのですね。 参考にしている書籍には、モジュールを保存すべきパスや保存名についての記述はありませんか?
LouiS0616

2019/07/20 14:42

マップデータをインポートする方法は、書籍で紹介されている方法そのままでしょうか。それとも、これまでに得た知識を元に0910path.exe.さんが自ら考えた方法でしょうか。
0910pass.py

2019/07/20 15:00 編集

コメントありがとうございます! モジュールを保存するパス 保存名についての記述… 現在その書籍で探しています。申し訳ない… 恥ずかしながら、書籍の全真似です。 プログラムの意味についても復習してみます。
guest

回答3

0

個人的見解ですが、データを保持する目的で有ればCSVやJSONを使うのがより適切だと考えます。
例えば次のように同様のコードを書くことができます。

パスのイメージ

plain

1source 2+--data 3| +--maru.json 4+--main.py

maru.json

JSON

1[ 2 [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], 3 [1, 2, 0, 0, 1, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 1], 4 [1, 0, 1, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 1], 5 [1, 0, 1, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1], 6 [1, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 0, 1], 7 [1, 0, 0, 0, 1, 1, 1, 1, 1, 1, 0, 1, 0, 0, 0, 0, 1, 1, 1], 8 [1, 0, 1, 0, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 1], 9 [1, 0, 1, 0, 0, 1, 1, 1, 0, 1, 0, 1, 0, 1, 1, 0, 1, 1, 1], 10 [1, 0, 1, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 3, 1], 11 [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1] 12]

main.py

Python

1import json 2 3 4# これさえ書き換えれば、どこにファイルを置いていても問題無い 5_MAP_PATH = r'./data/maru.json' 6def load_map_data(): 7 with open(_MAP_PATH) as fin: 8 data = json.load(fin) 9 10 return data

パスは自在に変更可能で、モジュールシステムに気を払う必要はありません。
また動的にファイルを切り替えるのも簡単です。


...と、ここまで書いておいて難ですが、とりあえずは書籍の方法に従った方が賢明かと思います。
慣れてきたときにふと思い出して、ちょっと試してみて頂けると利点にも自然と目が向くでしょう。

コードの書き方について

teratailには、コードを見やすく表示する機能があります。
質問編集画面を開き、コードを選択した状態で<code>ボタンを押して下さい。
Python

特にPythonの場合、インデントが崩れるとコードの意味が変わってしまいます。

投稿2019/07/20 16:16

LouiS0616

総合スコア35660

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

ベストアンサー

ファイル名はmaru_data.pyとするのが適当に思います。また、ファイルはmi.pyと同じディレクトリに保存してください。

上の操作で基本的にはいけると思いますが、どうしてもだめなら同じソース内にグローバル変数として定義し、load_map_dataは単にグローバル変数のdataを返すようにしてもいいのではないでしょうか。

(余談ですが、C:\Users\Maruyama\AppData\Local\Programs\Python\Python37\ではなく他の場所にmi.pyなどの自作のプログラムを配置した方が良いように思います。ここはPythonインタプリタのインストール先です。予期せぬ悪影響を避けるため、自分で開発したプログラムは他の場所に置くのが一般的です。)

投稿2019/07/20 14:44

編集2019/07/20 14:52
hayataka2049

総合スコア30933

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0910pass.py

2019/07/20 15:04

皆さんのおかげで、なんとか迷路を出力することができました! hayataka2049さん、kozuketecさん、LouiS0616さん、ご協力感謝します!
hayataka2049

2019/07/20 15:06

importに成功しましたか? それとも同じファイルに書く方法でやっちゃいましたか? どのみちimportがうまくいかないままだと後々困るので、後者の方法ならもう少し追求した方が良いかもしれません。前者なら問題ありません。
0910pass.py

2019/07/20 15:18

とりあえず解決方法としましては… 1環境変数にpythonpathを使用するように変更 2ファイル[maru_data]と[mi]を同じディレクトリに保存 3miを実行 成功! となりました。
guest

0

PYTHONPATHは設定されてますか?

# Python pathの追加 echo 'export PYTHONPATH=(importしたいmoduleが含まれるパス)' >> ~/.bash_profile # 設定読み込み source ~/.bash_profile

投稿2019/07/20 14:00

kozuketec

総合スコア156

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0910pass.py

2019/07/20 14:23

回答ありがとうございます! 設定していないかもしれません…。 確かめてみます。
hayataka2049

2019/07/20 14:47 編集

エラーメッセージからwindows環境であることが明確です。windowsの場合(特殊な場合を除いて)この回答の方法は無意味です。
kozuketec

2019/07/20 14:49

Cドライブ書いてますもんね。失礼しました。 環境変数を設定するという部分だけ参考にしていただきたいです。
0910pass.py

2019/07/20 14:56

たまげたなあ… 環境変数をpythonpathに変更しました。 ありがとうございます!
hayataka2049

2019/07/20 14:58

実行スクリプトのあるディレクトリは本来は自動的にimport時の探索対象に追加されるはずですので、設定は必要ないような気もしますが……ファイル名と保存先を確認するのが先でしょう。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問