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

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

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

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

Q&A

1回答

922閲覧

python ファイル名で判定させる処理について

退会済みユーザー

退会済みユーザー

総合スコア0

Python

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

0グッド

1クリップ

投稿2020/01/21 08:32

前提・実現したいこと

・ファイル名によって読み込むファイルを判別したい

【現状】
pythonでGUIを開発し、ボタンを押したらDBにデータを取り込むというプログラムを開発中です。

<全体開発イメージ>
・DB=SQLserver(SQLserver認証)で接続
・画面作成
・「参照ボタン」を作成する
・「取込ボタン」を作成する
・「参照ボタン」を押すとファイルダイアログを表示する。→Excelファイルを選択→選択したファイルパスも取得表示される。
・「取込ボタン」を押すとExcelファイルの中身を読み込んでDBにデータを格納。
・DB格納後、取り込んだデータの件数を入力ボックス等に表示

簡単には上記のようなイメージなのですが、今回は取り込みたいExcelファイルが2種類あり、ファイル名によって
取り込むデータを判別したいのですが、その判別させる処理で足踏みしている状況です。
<イメージ>
①取込年月に[yyyymm]と入力
②実行ボタン押下
③AのExcelファイル名を読み込んでDBへ格納
(もしくはBのExcelファイルを読み込みこんでDBへ格納)
※Excelファイル名には(yyyymm)の表記がされています。
例えば取込年月に「201910」と入力し、実行ボタンを押下するとExcelファイル名の"201910"を判定し、
ファイルを読み込んでDBに格納してくれるイメージです。

下の補足欄にも記載してますので、ご確認ください。

一旦、現在のコードを下記に記載します。

該当のソースコード

import tkinter as tk from tkinter.ttk import * from tkinter.filedialog import askopenfilename from tkinter import messagebox as msgbox import pyodbc import pandas as pd import os import re test = True class FormMain(tk.Frame): def __init__(self, master): super().__init__(master) master.title('データインポートプログラム') master.resizable(False, False) self.propagate(False) self.pack(expand=True, fill=tk.BOTH) pad = {"padx": 10, "pady": 10} # 取込ファイル種別の設定 lbl1 = Label(self, text='取込ファイル種別') lbl1.grid(row=0, column=0, cnf=pad) # Shipment Reportボタンの設定 self.ftype_var = tk.IntVar(value=1) ftype1 = Radiobutton(self, text='Shipment Report', variable=self.ftype_var, value=1) ftype1.grid(row=0, column=1, cnf=pad) # New Product Shipment Reportボタンの設定 ftype2 = Radiobutton(self, text='New Product Shipment Report', variable=self.ftype_var, value=2) ftype2.grid(row=0, column=2, cnf=pad, sticky=tk.W) # 取込年月の設定 lbl2 = Label(self, text='取込年月') lbl2.grid(row=1, column=0, cnf=pad) vcmd = (self.register(self.date_entry_validate), '%P') self.date_entry_var = tk.StringVar() date_entry = Entry(self, textvariable=self.date_entry_var) date_entry.configure(validate="key", validatecommand=vcmd) date_entry.grid(row=1, column=1, cnf=pad, sticky=tk.W) # 取込ファイルの設定 lbl3 = Label(self, text='取込ファイル') lbl3.grid(row=2, column=0, cnf=pad) self.file_entry_var = tk.StringVar() file_entry = Entry(self, textvariable=self.file_entry_var) file_entry.grid(row=2, column=1, columnspan=3, cnf=pad, sticky=tk.E + tk.W) # 参照ボタンの設定 file_sel_btn = Button(self, text='参 照', width=16, command=self.file_sel_clicked) file_sel_btn.grid(row=2, column=4, cnf=pad, sticky=tk.W) # 取込件数の設定 lbl4 = Label(self, text='取込件数') lbl4.grid(row=3, column=0, cnf=pad) self.num_entry_var = tk.StringVar() num_entry = Entry(self, textvariable=self.num_entry_var) num_entry.grid(row=3, column=1, cnf=pad, sticky=tk.W) lbl5 = Label(self, text='件') lbl5.grid(row=3, column=2, cnf=pad, sticky=tk.W) # 実行ボタンの設定 exec_button = Button(self, text='実 行 ', width=16, command=self.exec_clicked) exec_button.grid(row=4, column=4, cnf=pad, sticky=tk.W) if test: self.add_test_frame() # 文字数制限(半角数字6文字制限) def date_entry_validate(self, text): return (not text) or len(text) <= 6 and text.isdecimal() def file_sel_clicked(self): path = askopenfilename(initialdir=r'C:\Python', filetypes=[('Excel File', '*xlsx')]) if path: self.file_entry_var.set(path) # 半角数字6文字であるかのチェック def exec_clicked(self): if not re.match("[0-9]{6}", self.date_entry_var.get()): msgbox.showwarning(message="date format error") return # 取込ファイルとして指定されたファイルが存在するかチェック。 if not os.path.exists(self.file_entry_var.get()): msgbox.showwarning(message="file not found") return rowcount = 0 if self.ftype_var.get() == 1: data = self.read_book1(self.file_entry_var.get(), self.date_entry_var.get()) rowcount = self.insert(data) else: msgbox.showwarning(message="not implemented") # 取込ファイルのパス、取込年月を引数に受け取る def read_book1(path): df= pd.read_excel(path, index=False) # 抽出済みのデータを引数に受け取り、DBに接続 def insert(self, data): con = self.get_connection() cur = con.cursor() ret = 0 try: for i, row in data.iterrows(): # 抽出済みデータを行毎にループ。 # INSERT文を生成。 sql = ("INSERT INTO KLM VALUES('{}', '{}', '{}', '{}', '{}', '{}', '{}', '{}'" , '{}', '{}', '{}', '{}', '{}', '{}', '{}', '{}', '{}', '{}') sql = sql.format(row["Division"], row["Sales Org"], row["Sales Office"] ,row["Plant"], row["Shipment Date"], row["Material"], row["Packlist #"] ,row["Invoice Date"], row["Fiscal Date"], row["Quantity"], row["invoice #"] ,row["Value USD"], row["Ship Unit Cost USD"], row["Ship Total Cost"] ,row["Order Type"], row["Material Group"], row["Sold To Customer"] ,row["Customer Name"]) cur.execute(sql) # 取込件数を合算 ret += cur.rowcount cur.commit() except: cur.rollback() # インサートでエラーになった場合はロールバック。 finally: con.close() # DBへの接続を閉じる。 return ret self.num_entry_var.set(rowcount) msgbox.showinfo(message="正常に処理が実行されました") # SQL serverへの接続処理 def get_conn_str(self): driver = "{SQL Server}" server = r'SQLEXPRESS' user = 'test' password = 'test' database = 'sample' con_str = "DRIVER={};SERVER={};UID={};PWD={};DATABASE={};" return con_str.format(driver, server, user, password, database) def get_connection(self): conn = pyodbc.connect(self.get_conn_str()) return conn   def main():  app = tk.Tk()  FormMain(app)  app.mainloop()   if __name__ == "__main__":   main()

補足情報(FW/ツールのバージョンなど)

接続先DB:SQL Server(SQL認証でログインを想定)
開発ツール:MS Visual Studio
補足:
個人的にはif文で読み込むファイルを分岐させるというイメージはついていますが、どこに、どのようなコードを記述すればよいかが、いまいちピンと来ていません。取り込みたいファイルが2種類あると記載しましたが、2つともファイル名に(yyyymm)の記載がされています。取込年月のyyyymmとファイル名のyyyymmの重複が発生してしまいますので、そこもどのように判定させるか悩んでいます。(それかラジオボタンで判定させる処理のほうが良い?)

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

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

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

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

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

guest

回答1

0

・ファイル名によって読み込むファイルを判別したい

と書いてるのに、ファイル名の重複が発生するというのでは、ファイル名での判別は破綻している、ということになります。

まずは判別の方法、基準をはっきりさせましょう

投稿2020/01/21 08:48

y_waiwai

総合スコア87719

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

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

退会済みユーザー

退会済みユーザー

2020/01/22 01:49 編集

回答ありがとうございます。 確かに仰る通りです。 ただ仕様上は、「取込年月」の記載はMustなので、一旦ラジオボタン(Shipment Report/ New Product Shipment Report)で読み込むファイルを判定させる方法が知りたいので、教えていただけないでしょうか。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問