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

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

新規登録して質問してみよう
ただいま回答率
85.48%
ファイル

ファイルとは、文字列に基づいた名前又はパスからアクセスすることができる、任意の情報のブロック又は情報を格納するためのリソースです。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

1回答

2835閲覧

python 入力ボックスの値を取得しファイルを読み込む

退会済みユーザー

退会済みユーザー

総合スコア0

ファイル

ファイルとは、文字列に基づいた名前又はパスからアクセスすることができる、任意の情報のブロック又は情報を格納するためのリソースです。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2020/01/24 06:42

pythonでプログラムを開発中です。

入力ボックスの値を取得し、Excelファイルを読み込むには、どのように記述すべきなのか分からず足踏みしていますので質問させていただきました。

【イメージ】
・GUI画面を作成
・「参照」ボタン作成(クリックするとファイルファイアログ表示)
・入力ボックスを1つ作成(ここに選んだファイルパスが反映される)

【実現させたいこと】
・入力ボックスの値を取得して、Excelファイルの中身を全て読み込みたい。
・Excelファイルの1行目はヘッダー行なので、2行目から読み込みたい。

【困っているポイント】
・ファイル名を文字列として認識させ、処理する方法があるのか?

当方、pythonを触り始めてまだ間もないので、簡単なコード等記述していただければ大変助かります。

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

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

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

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

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

y_waiwai

2020/01/24 06:46

まずはコードを提示してくれないと答えようがないです。 コード制作依頼してるつもりなら、ここはそういうところじゃありません
退会済みユーザー

退会済みユーザー

2020/01/24 08:13 編集

前回私の質問にコメントを頂いた方ですよね? 前回は私がコードを載せて質問した後、コメントを頂いて私が返信しましたがそのままのようですね。 コード提示しても解決に結びつかないようであれば、別の方法を考えるしかないですよね。 ここは出来なくで困っている人たちに対して、解決せずただコメントをする場所ですか? コードがあったら解決できるということであれば、今回も再度、私が作成中のコードを以下のURLに貼り付けておきますね。 https://harigami.jp/cd?hsh=7a0a2b52-f7b4-4c69-be36-b523c023dfd3
y_waiwai

2020/01/24 08:20 編集

ここで回答がつかないというのは、ほとんどが質問が意味不明であるためです。 その意味不明の質問をなんとか意味がわかるようにするためにコメントしてますが、その結果、いぜん意味不明なのが少なくありません。 こちらも別にカネもらってるわけじゃないので、一度言って理解できない相手は放置するようにしております。 まあ、あなたがどう思おうと自由です。これからもがんばってくださいませ。
退会済みユーザー

退会済みユーザー

2020/01/24 08:25 編集

>その意味不明の質問をなんとか意味がわかるようにコメントしてますが →コメント頂いて返信したにも関わらず、そのままスルーされるようでは上記の仰っている内容に矛盾が生じますね。。 結局コードを提示しても解決できないんだなあということがよく理解できました。 ありがとうございます!
guest

回答1

0

ベストアンサー

・ファイル名を文字列として認識させ、処理する方法があるのか?

ファイル名は文字列ですよ。
tkinterを一切使わず、ファイル名を引数に取ってexcelを読み出す関数を作れますか?
そのあと、tkinterのGUI処理からその関数を呼び出すようにすればいいです。

ファイル名を決定するまでの処理を整理してみました。

python

1import tkinter as tk 2from tkinter.ttk import * 3from tkinter.filedialog import askopenfilename 4from tkinter import messagebox as msgbox 5import os 6import re 7 8 9class Data: 10 11 def __init__(self): 12 self.ftype = tk.IntVar(value=1) 13 self.date = tk.StringVar() 14 self.filename = tk.StringVar() 15 self.num = tk.StringVar() 16 17 def is_valid_date(self, text): 18 return (not text) or len(text) <= 6 and text.isdecimal() 19 20 def select_file(self): 21 path = askopenfilename(initialdir=r'C:\Python', 22 filetypes=[('Excel File', '*xlsx')]) 23 if path: 24 self.filename.set(path) 25 26 def validate(self): 27 date = self.date.get() 28 if not re.match("[0-9]{6}", date): 29 msgbox.showwarning(message="date format error") 30 return False 31 32 filename = self.filename.get() 33 if not os.path.exists(filename): 34 msgbox.showwarning(message="file not found") 35 return False 36 37 return True 38 39 40def execute(data): 41 if not data.validate(): 42 return 43 print("ftype:", repr(data.ftype.get())) 44 print("date:", repr(data.date.get())) 45 print("filename:", repr(data.filename.get())) 46 print("num:", repr(data.num.get())) 47 48 49def setup(view, data): 50 view.propagate(False) 51 view.pack(expand=True, fill=tk.BOTH) 52 pad = {"padx": 10, "pady": 10} 53 54 w = Label(view, text='取込ファイル種別') 55 w.grid(row=0, column=0, cnf=pad) 56 w = Radiobutton(view, text='Shipment Report', 57 value=1, variable=data.ftype) 58 w.grid(row=0, column=1, cnf=pad) 59 w = Radiobutton(view, text='New Product Shipment Report', 60 value=2, variable=data.ftype) 61 w.grid(row=0, column=2, cnf=pad, sticky=tk.W) 62 63 w = Label(view, text='取込年月') 64 w.grid(row=1, column=0, cnf=pad) 65 vcmd = (view.register(data.is_valid_date), '%P') 66 w = Entry(view, textvariable=data.date) 67 w.configure(validate="key", validatecommand=vcmd) 68 w.grid(row=1, column=1, cnf=pad, sticky=tk.W) 69 70 w = Label(view, text='取込ファイル') 71 w.grid(row=2, column=0, cnf=pad) 72 w = Entry(view, textvariable=data.filename) 73 w.grid(row=2, column=1, columnspan=3, cnf=pad, sticky=tk.E + tk.W) 74 75 w = Button(view, text='参 照', width=16, command=data.select_file) 76 w.grid(row=2, column=4, cnf=pad, sticky=tk.W) 77 78 w = Label(view, text='取込件数') 79 w.grid(row=3, column=0, cnf=pad) 80 w = Entry(view, textvariable=data.num) 81 w.grid(row=3, column=1, cnf=pad, sticky=tk.W) 82 w = Label(view, text='件') 83 w.grid(row=3, column=2, cnf=pad, sticky=tk.W) 84 85 w = Button(view, text='実 行 ', width=16, command=lambda: execute(data)) 86 w.grid(row=4, column=4, cnf=pad, sticky=tk.W) 87 88 89def main(): 90 app = tk.Tk() 91 app.title('データインポートプログラム') 92 app.resizable(False, False) 93 setup(tk.Frame(app), Data()) 94 app.mainloop() 95 96 97if __name__ == "__main__": 98 main()

main関数はアプリケーション担当。
GUIとデータを用意して描画処理やイベント処理(mainloop)をします。

setup関数はGUI構築担当。構築以外の仕事はしません。

Dataクラスはデータ担当。整合性確認などデータに関する処理だけを担当。

execute関数は、渡されたデータを使って実行処理を担当。
実行ボタンが押されたときに呼ばれます。

投稿2020/01/24 09:48

編集2020/01/27 02:50
shiracamus

総合スコア5406

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

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

退会済みユーザー

退会済みユーザー

2020/01/27 02:19

回答及び詳細なプログラム記述、ありがとうございます。 >tkinterを一切使わず、ファイル名を引数に取ってexcelを読み出す関数を作れますか? →すみません、少し自信がありません… >def execute(data): ここで記述して頂いたのは、どのような処理になりますでしょうか。 ここの関数コードの以下で、GUIを作成しているイメージですよね??
shiracamus

2020/01/27 02:30

execute関数は実行ボタンを押されたときに呼び出される処理です。 ひとまず、このコードを実行して何が起きるか確認してみてください。 そうすれば、execute関数の中にExelファイルを読み込む処理を書けば良さそうだと察しがつくと思います。
shiracamus

2020/01/27 02:49 編集

コードに関する説明を回答欄に追記しました。 クラスや関数の担当をひとつだけにして責務を明確にしています。
退会済みユーザー

退会済みユーザー

2020/01/27 02:50

なるほどですね。 jupyter notebookで実行したところ、"取込ファイル"の入力ボックスを読み込んでいることを確認しました。 そうすると、仰る通り、後はexecute関数の中にExcelファイルを読み込む記述をすれば、ファイル名に関わらず読み込んでくれるという認識で合っていますか?
退会済みユーザー

退会済みユーザー

2020/01/27 03:53

承知しました。 この度は詳細にアドバイスいただき助かりました。 説明大変分かりやすかったです。 ありがとうございました。
shiracamus

2020/01/27 04:11

excelから読み込む関数は、他のプログラムでも使いたくなるかもしれません。 再利用しやすい独立関数にしておくといいですよ。 importして使えるモジュールかパッケージにできれば上出来です。
退会済みユーザー

退会済みユーザー

2020/01/27 04:31

よく他のpythonコードを眺めていたら、自作関数?で分かりやすく関数定義しているコードを見かけたりもします。(ここらへん結構混乱しています) 関数名に関しては、「この処理をしたいのならこの関数を使いましょう」とあらかじめお作法があるのか、それとも「こういう処理をしたいから関数名は自分で作っちゃおう」なのか、その使い分けがいまいち理解できていません。 なのでいつも関数を作るときに、「これは何ていう関数名にしたらいいんだろう…」と迷ってしまいます。。。
shiracamus

2020/01/27 04:51 編集

関数名は自分で決めるものです。 作法としては、PEP8 Pythonコードのスタイルガイドに合わせて、小文字の単語をアンダースコア文字で繋げた名前にしましょう。 https://pep8-ja.readthedocs.io/ja/latest/ 何か処理をする関数なら、命令の動詞で始めて V+O、V+O+O の英文法に合わせるといいです。 値を取得するならその値の名前(名詞)にすることもあります。 リーダブルコードという読みやすい書き方を勉強するといいです。 https://www.google.com/search?q=%E3%83%AA%E3%83%BC%E3%83%80%E3%83%96%E3%83%AB%E3%82%B3%E3%83%BC%E3%83%89&ie=UTF-8&oe=UTF-8 https://qiita.com/search?q=リーダブルコード
退会済みユーザー

退会済みユーザー

2020/01/27 05:15

なるほどですね。 一度、勉強してみます。 例えば今回のようなGUI開発を行う場合ですが、先に関数定義を行ってから、後でGUIの部分を構築する書き方のほうが良いのでしょうか?(書き方の順番とかは開発を行う上で影響ありますか?)
shiracamus

2020/01/27 05:41 編集

人それぞれです。 私の場合「こんな関数/クラスがあったら便利なのになぁ。あったらこう使うんだけど」と考えて、世の中に存在しない関数/クラスを使って処理を書きます。 その後、その関数/クラスを実装します。 その関数・クラスでは1つのことだけを担当させて、それ以外の重たい処理が必要になったら同様にありもしない関数・クラスを使って処理を書きます。 それを繰り返してます。 クラスを作るときにはオブジェクト指向設計が欠かせないので、UMLで図を書いて役割分担を考えたりしてます。
shiracamus

2020/01/27 05:47

GUI開発では、データとビジネスロジックとUIを分離して開発するのが一般的です。 データやビジネスロジックはGUIでもCUIでも使えるものです。 データからビジネスロジックは呼ばない(依存しない)。 データやロジックからUIを呼ばない(依存しない)ように作ります。
退会済みユーザー

退会済みユーザー

2020/01/27 05:51

そうだったんですね。 なんとなく理解出来てきました。 今回の質問と趣旨がずれてしまうようで申し訳ないのですが、根本的な観点として、プログラミングを上達させるには、どのような方法(訓練)が必要になりますでしょうか。 本を読んでひたすら勉強? 意味が全く分からなくても、とりあえずコードを写して手を動かしてみる? 私の場合、今までVBAしか触ったことがないので、あまりプログラミングというものにまだ慣れていません。どのようにスキルを磨かれましたか?
shiracamus

2020/01/27 06:10 編集

プログラミングは設計命だと思うので、プログラム設計、特にオブジェクト指向設計について勉強するといいです。本をベースに、本の内容について書いてるブログなどを読んで理解が同じか確認してみたり。 どんどん新しい設計手法や考え方が出てきていて、最近は「クリーンアーキテクチャ」がホットだと思います。 https://www.google.com/search?q=%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%A2%E3%83%BC%E3%82%AD%E3%83%86%E3%82%AF%E3%83%81%E3%83%A3&ie=UTF-8&oe=UTF-8 プログラマは大工さん。金づち、ノコギリ、カンナの代わりにプログラミング言語(if, for, while, 関数、クラス)や開発環境を操る人。 でも、家を立てるときには一級建築士にお願いするように、安心・安全・便利な設計が欠かせません。プログラムでも同様に設計が重要です。
退会済みユーザー

退会済みユーザー

2020/01/27 06:11

まずはオブジェクト指向の基本から勉強してみます。 プログラミング上級者の方が「1つの言語をマスターできれば、他の言語もお作法が違うだけで、そこまで変わらない」ということも聞いたこともあるのですが、やはりそれも事実でしょうか。
shiracamus

2020/01/27 06:40

1つの言語では無理だと思います。 私は C, Java, Python を学んだ後、C#とJavaScriptはすんなり学習できました。 Cでローレベル(ハードウェアに近い)開発、Javaでアプリケーション/Web開発、Pythonで自由気ままなスクリプトプログラミングと、ジャンルと考え方が全く違う3言語を学んだのがとても役立ってます。 C++だけは挫折して、いまだに体が拒否反応を示します。
退会済みユーザー

退会済みユーザー

2020/01/27 06:50

同じプログラミング言語でもやはり違いがあるのですね。 Cが出来る人はC++も出来ると勝手に想像していたのですが、そうではないのですね。 でも、これから先のことを考えるとPythonは出来るようになったほうが良いですよね?
退会済みユーザー

退会済みユーザー

2020/01/27 07:08

イメージがついてきました。 ありがとうございます。 因みにここのサイトは、個人宛に質問をすることは可能なのでしょうか?
shiracamus

2020/01/27 07:27

個人宛に質問するなら家庭教師を雇いましょう。
退会済みユーザー

退会済みユーザー

2020/01/27 07:29 編集

確かにそうですね。 詳しくご教授いただきありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問