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

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

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

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

Tkinter

Tkinterは、GUIツールキットである“Tk”をPythonから利用できるようにした標準ライブラリである。

pandas

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

Q&A

解決済

1回答

415閲覧

Python Pandas利用したcsv読出時の不具合

Kazu

総合スコア5

Python 3.x

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

Tkinter

Tkinterは、GUIツールキットである“Tk”をPythonから利用できるようにした標準ライブラリである。

pandas

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

0グッド

0クリップ

投稿2022/02/21 22:50

編集2022/03/03 15:47

前提・実現したいこと

実際に行いたいことは黄色枠部分の表示ですが
ID部分は全6桁で1であれば000001と表示し
枝番は全3桁で1であれば001と表示したい
イメージ説明

読み込んでいるCSVファイルは下記内容となっております。
イメージ説明

この内容についてご教授いただければ幸いです。
よろしくお願い致します。

該当のソースコード

python

1 2#EXCElファイルからCSVファイル作成 3  data = pd.read_excel(excel_search + '.xlsx') 4 data.to_csv(excel_search + '.csv', encoding="utf-8", index=False) 5 6#検索用画面をサブウインドウで構築 7class SubWindow(tkm.Frame): 8 def __init__(self,master,num): 9 super().__init__(master) 10 self.pack() 11 master.geometry("1000x400+400+300") 12 master.title("検索画面") 13 master.grab_set() 14 self.set_data() 15 self.create_widgets() 16 17#csvファイル読込 18def set_data(self): 19 self.data = pd.read_csv("/search.csv", dtype=object, encoding="utf-8", na_filter=False) 20 self.colname_list = ["ID", "日付","登録者社員番号","支店","種別","プロジェクト番号","枝番","顧客名","金額"] 21 self.width_list = [10, 15, 30, 20, 20, 40, 10, 200, 50] 22 self.search_col = "検索キーワード" 23 24def create_widgets(self): 25 self.pw_main = ttk.PanedWindow(self.master, orient="vertical") 26 self.pw_main.pack(expand=True, fill=tkm.BOTH, side="left") 27 self.pw_top = ttk.PanedWindow(self.pw_main, orient="horizontal", height=25) 28 self.pw_main.add(self.pw_top) 29 self.pw_bottom = ttk.PanedWindow(self.pw_main, orient="vertical") 30 self.pw_main.add(self.pw_bottom) 31 self.creat_input_frame(self.pw_top) 32 self.create_tree(self.pw_bottom) 33 34def creat_input_frame(self, parent): 35 fm_input = ttk.Frame(parent, ) 36 parent.add(fm_input) 37 lbl_keyword = ttk.Label(fm_input, text="キーワード", width=7) 38 lbl_keyword.grid(row=1, column=1, padx=2, pady=2) 39 self.keyword = tkm.StringVar() 40 ent_keyword = ttk.Entry(fm_input, justify="left", textvariable=self.keyword) 41 ent_keyword.grid(row=1, column=2, padx=2, pady=2) 42 ent_keyword.bind("<Return>", self.search) 43 44def create_tree(self, parent): 45 self.result_text = tkm.StringVar() 46 lbl_result = ttk.Label(parent, textvariable=self.result_text) 47 parent.add(lbl_result) 48 self.tree = ttk.Treeview(parent) 49 self.tree["column"] = self.colname_list 50 self.tree["show"] = "headings" 51 self.tree.bind("<Double-1>", self.onDuble) 52 for i, (colname, width) in enumerate(zip(self.colname_list, self.width_list)): 53 self.tree.heading(i, text=colname) 54 self.tree.column(i, width=width) 55 parent.add(self.tree) 56 57def search(self, event=None): 58 keyword = self.keyword.get() 59 result = self.data[self.data[self.search_col].str.contains(keyword, na=False)] 60 self.update_tree_by_search_result(result) 61 62def update_tree_by_search_result(self, result): 63 self.tree.delete(*self.tree.get_children()) 64 self.result_text.set(f"検索結果:{len(result)}") 65 for _, row in result.iterrows(): 66 self.tree.insert("", "end", values=row[self.colname_list].to_list()) 67 68def onDuble(self, event): 69 for item in self.tree.selection(): 70 print(self.tree.item(item)["values"]) 71 72

試したこと

作成されたCSVファイルを一度開き、名前付けて保存【CSV UTF-8】で再度作成した場合には
上記内容が解消されましたが
pythonでExcelファイルからCSV吐き出しし読込動作となると上記結果となってしまいます。

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

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

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

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

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

guest

回答1

0

ベストアンサー

表生成に利用してるのは、ttk.Treeview なので、
書式制御のオプションは有りません。

データを追加する際に、個別に文字列形式に変換する必要があります。
(self.tree.insert の values に与える部分)

枝番は小数として読み込まれてるようなので、
読み込み時に型指定するか、int()で整数に変換も必要です。

python

1>>> num = 1 2>>> f"{num:06}" 3"000001"

数値セルの右寄せは、column メソッドで指定可能です

python

1self.tree.column(column_id, anchor="E") # East/右寄せ

投稿2022/03/01 08:12

teamikl

総合スコア8664

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

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

Kazu

2022/03/02 08:05

ご回答ありがとうございます。 素人で申し訳ございません。 ご教授いただきました、型変更と右寄せですが 実際にどうのように記載すればよろしいのでしょうか。 まだ、コード内容の全てを把握出来ていない状況で適用方法が よく分かっておりません。 お手数をおかけしますがご教授いただけると幸いです。
teamikl

2022/03/02 08:25

実際の記述はデータ次第(スクリーンショットではなく実際のテキストデータ)ですが、 コードの該当箇所は以下の部分です self.tree.insert("", "end", values=row[self.colname_list].to_list()) insert に渡す前に、任意の列の書式を変更します 変更例 (index 0にID, 6が枝番の場合) values = row[self.colname_list].to_list() values[0] = f"{values[0]:06"}" values[6] = f"{int(values[6]):03}" self.tree.insert("", "end", values=values) f"...." はフォーマット済文字列リテラル(f-strings) という書式指定のための python の文字列です。 tree に格納されるデータは文字列型に変換されているので、 元の数値データをウィジェットから得られなくなる点には、注意してください。 右寄せについては、ウィジェット生成時に一度のみ呼び出すので create_tree関数内のcolumn, heading を設定してるところで 一緒に設定します。
Kazu

2022/03/03 06:47

再度のご教授ありがとうございます。 values = row[self.colname_list].to_list() values[0] = f"{values[0]:06"}" values[6] = f"{int(values[6]):03}" self.tree.insert("", "end", values=values) の部分適用したところ IDの部分が100000となってしまったので values[6] = f"{int(values[6]):03}"と同様に values[0] = f"{int(values[0]):06}"と変更しましたところ 正常に表示ができました。 また、位置調整についても表示変更することができました 。 親切ご丁寧にありがとうございました。 まだまだ、勉強しないとダメだと痛感いたしました。 非常に勉強になります。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問