機械系エンジニアの備忘録

20代独身社会人。仕事では機械・機構の研究開発を行っているエンジニアが、自分の専門分野ではないpythonを扱って楽しむブログです。

MENU

【python+Tkinter】【初心者】1度に複数のcsvファイルを読み取り新規Excelファイルとして保存する方法

Tkinterで1度に複数のCSVを選択して読み取る方法 (おまけpart1)

■はじめに

これまでpart1~part3で、tkinterを用いてCSVファイル内の数値データを抽出し、新規Excelファイルとして保存する一連の流れを紹介しました。

 

 part1 tkinterを使って任意のCSVファイルを指定する方法

stjun.hatenablog.com

 

part2 指定したCSVファイルから数値情報を抜き出す方法

stjun.hatenablog.com

 

part3 CSVから抜き出した情報をExcelファイルに保存する方法

stjun.hatenablog.com

 

今回から上記part1~3で作ったコードを改良していきたいと思います。

まず、前回までのコードだと1度に選べるCSVファイルが1つのため、複数のCSVファイルを処理したい場合に何度もクリックする必要があり非常に面倒です。

そこで複数のCSVファイルを一度に処理できるようにしたいと思います。

 

■コード

import tkinter as tk #tkinterを使用するため
import tkinter.filedialog as fl #CSVを読み取るため
import tkinter.messagebox as mb #完了後にメッセージを表示するため
import numpy as np 
import time
import openpyxl as px #Excelを扱うため

root=tk.Tk()

#ボタンを押した時の処理
def get(*args):
    
    #新しいExcelの作成
    wb=px.Workbook()
    
    #エクセル内の各シートの名前
    sheet_title=["計算結果1","計算結果2","計算結果3"]
    
    #複数のCSVファイルを選ぶ
    #ユーザー名にお使いのPCの名前を入れてください
    filetype=[("all file","*")]    
    path=fl.askopenfilenames(initialdir="C:/Users/ユーザー名/Desktop",filetypes=filetype,title="select file")
    print(path) #CSVが読み取られているかの確認
    
    # 読み取った複数のCSVファイルを1つのExcelファイルにまとめる
    for i in range(len(path)):
        data_1, data_2,data_3= np.loadtxt(fname=path[i], skiprows=2, unpack=True)

        #Excel内に新しいシートを作成
        new_sheet=wb.create_sheet("計算結果")
        ws = wb["計算結果"]

        #作成したシートの名前を設定
        ws.title=sheet_title[i]

        #Excel一行目にどんな物理量について計算したか記載するためのリスト
        list_target=["物理量A(単位)","物理量B(単位)","物理量C(単位)"]

        #Excelの1行目に上記リストを記載する
        for i in range(len(list_target)):
            ws.cell(row=1,column=i+1,value=list_target[i])

        #Excelの2行目以降にCSVデータを代入する
        for i in range(len(data_1)):
            ws.cell(row=i+2,column=1,value=data_1[i])
            ws.cell(row=i+2,column=2,value=data_2[i])
            ws.cell(row=i+2,column=3,value=data_3[i])

    #今日の日付・時間を取得(ファイル名に入れるため)
    timestr=time.strftime("%Y%m%d-%H%M%S") #年月日時分秒の形式で取得
    
    #Excelデータをデスクトップに保存する(ユーザー名にお使いのPCの名前を入れてください)
    wb.save(r"/Users/ユーザー名/Desktop/test"+timestr+".xlsx")
    
    #処理が完了したことをユーザーに知らせる
    mb.showinfo("確認","Excelファイルの作成が完了しました")
    message["text"]="処理が完了しました"

message=tk.Label(root,text="ファイルを選択してください",width=30)
message.grid(row=0,column=0)

button=tk.Button(text="開く",command=get)
button.grid(row=0,column=1)

root.mainloop()

コードを実行すると次の画面がでてきます。

f:id:stjun:20190807234508p:plain

右側の開くボタンを押すと選択画面がでてきます。

f:id:stjun:20190807234916p:plain

またCtrlを押しながらクリックするとCSVファイルを複数選ぶことができます。

今回はdata01~data03の順番に選択しました。

f:id:stjun:20190807234952p:plain

開くを押すと次のように確認画面が表示されます。

f:id:stjun:20190807235049p:plain

すると新しいExcelファイルがデスクトップに作成されます。

ファイル名は作成日になっています。

f:id:stjun:20190807235400p:plain

Excelファイルを開くと次のように、新しいシート「計算結果1~3」が作成され、計算結果1のシートにはdata01.csvが、計算結果2のシートにはdata02.csvが、計算結果3のシートにはdata03.csvのデータが格納されています。

f:id:stjun:20190808000336p:plain

f:id:stjun:20190808000358p:plain

f:id:stjun:20190808000411p:plain

以上より、複数のCSVからデータを抽出して、Excelファイルにまとめることができました。

 

■説明

基本は冒頭で紹介した記事のpart1~part3と同じなため、変更点のみ記載します。

まず複数のCSVを一度に選択したい場合はaskopenfilenamesを使います。

 path=fl.askopenfilenames(initialdir="C:/Users/ユーザー名/Desktop",filetypes=filetype,title="select file")

この時、変数pathには次のようにリスト形式でCSVのパスが格納されます。

f:id:stjun:20190808001143p:plain
すなわちリスト1番目であるpath[0]にはdata01.csvのパスが、リスト2番目のpath[1]にはdata02.csvのパスが、リスト3番目のpath[2]にはdata03.csvのパスが格納されていることになります。

そこで次のようにfor文を使ってリストに格納されているpathを1つ1つ参照していきます。loadtxtの使い方は冒頭で紹介した記事のpart1で説明しているため省略します。

    for i in range(len(path)):
        data_1, data_2,data_3= np.loadtxt(fname=path[i], skiprows=2, unpack=True)

 

 次にExcel内に新しいシートを作成する方法を紹介します。

新しいシートはwb.create_sheet("シートのタイトル名")で作成できます。

またws=wb["シートのタイトル名"]でどのシートをアクティブにするか(どのシートにCSVのデータを書き込むか)を指定できます。

今回、とりあえずシート名は後で書き直すので、仮としてwb.create_sheet("計算結果")として新しいシートを作成しています。

そしてすぐ次の行でws=wb["計算結果"]とし、作ったシートを選択(アクティブに)します。最後にws.title=sheet_title[i]で選択したシートの名前を希望の名前に変更しています。なお、あらかじめ設定したい名前を格納したsheet_titleというリストを最初の1文で作っています。

    
    #エクセル内の各シートの名前
    sheet_title=["計算結果1","計算結果2","計算結果3"]
    
    # 読み取った複数のCSVファイルを1つのExcelファイルにまとめる
    for i in range(len(path)):

        #Excel内に新しいシートを作成
        new_sheet=wb.create_sheet("計算結果")
        ws = wb["計算結果"]

        #作成したシートの名前を設定
        ws.title=sheet_title[i]

最後に処理が完了したことを確認するため、アラートが出るように設定しています。

#処理が完了したことをユーザーに知らせる
    mb.showinfo("確認","Excelファイルの作成が完了しました")

 

■コーヒーブレイク:買ってよかったものを紹介

新しい試みとして、私がこれまで買った物の中ですごく良かったものを紹介してみようと思います。今日紹介するのは私が長年愛用しているEIZOのディスプレイです。

 このディスプレイを初めて使用した時は非常に感動しました。

私は目が疲れやすくまた目が疲れるとなぜか肩が凝るため、プログラムを書いている時は体調を崩しがちでした。しかしこのディスプレイは個人的には紙を見ているような感覚で全然目が疲れません。21.5インチもありますが23.8インチの方が広々と画面を使えるためおすすめです。

ただし音質はあまりよくありません。聞ければ良いという人なら気にならないと思いますが、音楽等聴きたいのであれば別途スピーカーを購入するのが良いと思います。

私はコスパで以下2つのスピーカーを使用しています。

     

JBLのスピーカーはEWAの2倍ほど値段が高いですが音は約5000円とは思えないくらい良いです。ただEWAも音は悪くなく安い・小さく持ち運びしやすい等のメリットがありどちらもおすすめです。

 

■最後に

これで一度に複数のCSVを選択してExcelファイルにまとめることができました。ただExcelシートの作成や選択の部分はごり押しなので、時間があるときにもっとスマートな方法を考えてみたいと思います。