🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
CSV

CSV(Comma-Separated Values)はコンマで区切られた明白なテキスト値のリストです。もしくは、そのフォーマットでひとつ以上のリストを含むファイルを指します。

保存

保存(save)とは、特定のファイルを、ハードディスク等の外部記憶装置に記録する行為を指します。

Python

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

pandas

Pandasは、PythonでRにおけるデータフレームに似た型を持たせることができるライブラリです。 行列計算の負担が大幅に軽減されるため、Rで行っていた集計作業をPythonでも比較的簡単に行えます。 データ構造を変更したりデータ分析したりするときにも便利です。

Q&A

解決済

1回答

2942閲覧

python 初めてのtreeviewのデータをCSVに出力したい

ekTJ

総合スコア109

CSV

CSV(Comma-Separated Values)はコンマで区切られた明白なテキスト値のリストです。もしくは、そのフォーマットでひとつ以上のリストを含むファイルを指します。

保存

保存(save)とは、特定のファイルを、ハードディスク等の外部記憶装置に記録する行為を指します。

Python

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

pandas

Pandasは、PythonでRにおけるデータフレームに似た型を持たせることができるライブラリです。 行列計算の負担が大幅に軽減されるため、Rで行っていた集計作業をPythonでも比較的簡単に行えます。 データ構造を変更したりデータ分析したりするときにも便利です。

0グッド

0クリップ

投稿2020/12/16 05:26

編集2020/12/16 05:57

目標:GUI上でユーザーにデータを入力してもらったら、[登録]ボタンでtreeviewにそのデータを1行ずつ追加&表示。
そして、最後に[保存]ボタンでtreeviewに溜まったデータを最後にcsvに出力したいです。

現状:treeviewから直接csvへの出力するやり方を見つけられなかったため、一行ずつpandasでデータフレームに書き込み、最後にそのデータフレームをCSVとして保存しようと考えました。
ただ、現在実行するとこのようなエラーが出てしまいます。初心者すぎる質問で大変心苦しいですが、目標を達成できるように助言いただけないでしょうか。

宜しくお願い致します。

NameError: name 'hinmei' is not defined

python

1#ライブラリインポート 2import tkinter as tk 3import tkinter.messagebox as tkm 4from tkinter.scrolledtext import ScrolledText 5import tkinter.ttk as ttk 6import cx_Oracle 7import os 8import csv 9import pandas as pd 10import textwrap 11 12#情報 13desktop_path = os.getenv("HOMEDRIVE") + os.getenv("HOMEPATH") + "\Desktop"+"\" 14names = ["配布先","品番表示","枝番表示","商品名1","商品名2","税率","税込小売価格","本体小売価格","税込卸価格","本体卸価格","入数表示","出力枚数","入力者番号"] 15df = pd.DataFrame(columns=names) 16 17def btn_click1(): 18 df.to_csv("_{}.csv", index= False,encoding="shift-jis") 19 tkm.showinfo("情報", "CSVを保存しました") 20 21def btn_click(): 22 23 haihin = str(txt1.get()) 24 hinmei = "\n".join(textwrap.wrap(txt4.get('1.0', 'end -1c'), width=23)) 25 code= str(txt2.get()) 26 mai= str(txt5.get()) 27 tree.insert("", "end", values=(code,hinmei,mai,1,1,1,1,1,1)) 28df= df.append(["haihin","code","","hinmei","商品名2","税率","税込小売価格","本体小売価格","税込卸価格","本体卸価格","入数表示","mai","入力者番号"]) 29print(df) 30#画面表示 31root = tk.Tk() 32root.geometry('1300x800+250+100') 33root.title('入力画面') 34root.minsize(width=1300, height=800) 35 36#配布先FLBX 37lbl1 = tk.Label(text='配布先FLBX',relief="ridge",font=(u'MS ゴシック', 11, 'bold')) 38lbl1.place(x=10, y=18) 39txt1 = tk.Entry(width=10) 40txt1.place(x=105, y=20) 41 42#商品コード 43lbl2 = tk.Label(text='商品コード',relief="ridge",font=(u'MS ゴシック', 11, 'bold')) 44lbl2.place(x=10, y=50) 45txt2 = tk.Entry(width=30) 46txt2.place(x=105, y=52) 47lbl2_1 = tk.Label(text='10桁入力(品番/CL/SZ)',font=(u'MS ゴシック', 9, 'bold')) 48lbl2_1.place(x=290, y=55) 49 50#登録内容 51lbl3 = tk.Label(text='登録内容',font=(u'MS ゴシック', 11, 'bold')) 52lbl3.place(x=15, y=92) 53 54#商品名 55lbl4 = tk.Label(text='商品名',relief="ridge",font=(u'MS ゴシック', 11, 'bold')) 56lbl4.place(x=105, y=92) 57txt4 = tk.Text(root, font=(u'MS ゴシック', 11, 'bold'),width=23,height=2)#字数制限、要確認!! 58txt4.place(x=165, y=94) 59#txt4.configure(state='disabled') 60 61#出力枚数 62lbl5 = tk.Label(text='出力枚数',relief="ridge",font=(u'MS ゴシック', 11, 'bold')) 63lbl5.place(x=380, y=90) 64txt5 = tk.Entry(width=20) 65txt5.place(x=380, y=110) 66txt5.insert(tk.END,1) 67 68#商品情報 69lbl6 = tk.Label(text='小売価格 '+ " 0,000",relief="ridge",font=(u'MS ゴシック', 11, 'bold')) 70lbl6.place(x=540, y=90) 71 72lbl7 = tk.Label(text='本体価格 '+ " 0,000",relief="ridge",font=(u'MS ゴシック', 11, 'bold')) 73lbl7.place(x=540, y=110) 74 75lbl8 = tk.Label(text='卸価格 '+ " 0,000",relief="ridge",font=(u'MS ゴシック', 11, 'bold')) 76lbl8.place(x=774, y=90) 77 78lbl9 = tk.Label(text='卸本体価格 '+ " 0,000",relief="ridge",font=(u'MS ゴシック', 11, 'bold')) 79lbl9.place(x=740, y=110) 80 81lbl10 = tk.Label(text='消費税率 '+ " 10%",relief="ridge",font=(u'MS ゴシック', 11, 'bold')) 82lbl10.place(x=954, y=90) 83 84lbl11 = tk.Label(text='入数表示 '+ " (@×,××)",relief="ridge",font=(u'MS ゴシック', 11, 'bold')) 85lbl11.place(x=954, y=110) 86 87#登録ボタン 88btn = tk.Button(root, text='登録',width=8, font=("Menlo",11), bg="yellow2",command=btn_click) 89btn.place(x=1170, y=105) 90 91#保存ボタン 92btn1 = tk.Button(root, text='保存',width=8, font=("Menlo",11), bg="yellow2",command=btn_click1) 93btn1.place(x=1170, y=440) 94 95#商品コード 96lbl12 = tk.Label(text='商品コード',font=(u'MS ゴシック', 11, 'bold')) 97lbl12.place(x=10, y=160) 98 99 100#treeview 101frame = tk.Frame() 102frame.place(x=50,y=190) 103 104tree = ttk.Treeview(frame) 105tree.grid(row=0, column=0) 106tree["columns"] = (1,2,3,4,5,6,7,8,9) 107tree["show"] = "headings" 108 109tree.column(1,width=180) 110tree.column(2,width=200) 111tree.column(3,width=60) 112tree.column(4,width=140) 113tree.column(5,width=140) 114tree.column(6,width=140) 115tree.column(7,width=140) 116tree.column(8,width=60) 117tree.column(9,width=140) 118 119tree.heading(1,text="商品コード") 120tree.heading(2,text="商品名") 121tree.heading(3,text="出力枚数") 122tree.heading(4,text="小売価格") 123tree.heading(5,text="本体価格") 124tree.heading(6,text="卸価格") 125tree.heading(7,text="卸本体価格") 126tree.heading(8,text="消費税率") 127tree.heading(9,text="入数表示") 128 129 130ysb = tk.Scrollbar(frame, orient=tk.VERTICAL, width=16, command=tree.yview) 131tree.configure(yscrollcommand=ysb.set) 132ysb.grid(row=0, column=1, sticky='news') 133 134#表示保持 135root.mainloop()

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

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

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

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

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

teamikl

2020/12/16 05:51

別のエラー NameError: name 'i' is not defined がでました。 掲載されたコードは実行されたものと同じですか?
ekTJ

2020/12/16 05:57

質問文のコード修正致しました。 宜しくお願いします。
guest

回答1

0

ベストアンサー

問題点

  • 変数 db がローカル変数 → グローバル宣言 (btn_click1 でも参照するため。ローカル変数は外部から参照できません)
  • コードの配置。Python ではインデントでブロックを表現します。

 hinmei は btn_click 内のローカル変数なので、
df.append に合わせるには、インデントが必要です。

  • print(df) の行は、どちらとも取れるので、必要に応じてインデントを入れてください。

diff

1- df= df.append([haihin,code,"",hinmei,"商品名2","税率","税込小売価格","本体小売価格","税込卸価格","本体卸価格","入数表示","mai","入力者番号"]) 2- print(df) 3 4+ global df 5+ df= df.append([haihin,code,"",hinmei,"商品名2","税率","税込小売価格","本体小売価格","税込卸価格","本体卸価格","入数表示","mai","入力者番号"]) 6+ print(df)

投稿2020/12/16 05:51

teamikl

総合スコア8738

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

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

ekTJ

2020/12/16 07:17

申し訳ございません、コメントに書かれているコードが分かりません。 -、+などどういう意味でしょうか??
teamikl

2020/12/16 07:22

diff という表示形式です。 マイナスが削除する行、プラスが追加する行。 具体的には修正点は以下の2点 - ローカル変数 df を global 宣言してグローバル変数にする - btn_click 関数後の df.append の行は、hinmei を参照するので、  インデントをいれて 変数hinmei と同じスコープを持つ関数内に入れる。
ekTJ

2020/12/16 07:46

なるほど!!理解出来ました!! ちなみになのですが、 あらかじめdfの列名を ["配布先","品番表示","枝番表示","商品名1","商品名2","税率","税込小売価格","本体小売価格","税込卸価格","本体卸価格","入数表示","出力枚数","入力者番号"]こちらにして、 中身のデータにこの辺のデータを入れていくにはどうすればよいのでしょう??? ''' haihin = str(txt1.get()) hinmei = "\n".join(textwrap.wrap(txt4.get('1.0', 'end -1c'), width=23)) code= str(txt2.get()) mai= str(txt5.get()) '''
teamikl

2020/12/16 07:52

df.append が該当するのでは? 修正前のコードでは正常だったはずですが df.append(["haihin","code", ... では "haihin" という文字列をデータに入れてるので df.append([haihin,code,... のように、必要なところは変数を参照するようにします
ekTJ

2020/12/16 08:15

こんな状態で出力されてしまっています・・・ カラム名 現状: 0 入力者番号 入数表示 出力枚数 品番表示 商品名1 商品名2 本体卸価格 本体小売価格 枝番表示 税率 税込卸価格 税込小売価格 \ 0 1518 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 1 fsff NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 2 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 3 fs NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 4 商品名2 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 5 税率 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 6 税込小売価格 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 7 本体小売価格 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 8 税込卸価格 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 9 本体卸価格 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 10 入数表示 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 11 mai NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 12 入力者番号 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 理想: 列名 [配布先,品番表示,枝番表示,商品名1,商品名2,税率,税込小売価格,本体小売価格,税込卸価格,本体卸価格,入数表示,出力枚数,入力者番号] 行名(無し) haihin,code,"",hinmei,"000","111","222","3333","4444","555","666",mai,"777" みたいにしたいのです。
teamikl

2020/12/16 08:48 編集

pandas の扱いの問題ですね。複数の問題が混在してしまうので、問題は切り分けて 次のステップとしては「tkinter は使わずに」 pandas で CSV を出力する単体のプログラムを作ってみてください。 ==== import pandas as pd df = pd.DataFrame(columns=["A", "B", "C"]) row = pd.Series([1, 2, 3], index=df.columns) df = df.append(row, ignore_index=True) # もしくは、ignore_index=True を指定して、リストではなく辞書 df = df.append({"A": 1, "B": 2, "C": 3}, ignore_index=True) print(df) df.to_csv("a.csv")
teamikl

2020/12/16 08:51

辞書の作り方: 組み込みのzip関数で、キーと値のリストから辞書を作れます row = dict(zip(df.columns, [haihin,code,"",hinmei, ...])) df = df.append(row, ignore_index=True)
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問