Pythonでログ解析(6) 〜ログ解析対象日を入力させるまで〜

ベル

今回の授業は、「Pythonでログ解析(3)」で作成したコードをベースに、『ログ解析したい日にちをユーザに指定させる仕組み』を教えていきたいと思います。前回のコードままだと、Pythonのコードに日にちを入れないといけないので、メンテナンスに不便を感じていたと思います。誰でも使えるようにしていきましょうね!

 

それでは、過去の授業で受けていないものがありましたら、こちらから学習しておいてくださいね。この内容が分かっている前提で授業を進めていきますよー。

Pythonでログ解析(1) ~パソコンにPythonを入れるまで~

Pythonでログ解析(2) ~プログラムを実行するまで~

Pythonでログ解析(3) ~ログの読み込みからCSVファイルの作成まで~

Pythonでログ解析(4) 〜【番外編①】ログの定期取得マクロ〜

Pythonでログ解析(5) 〜【番外編②】ログの定期取得マクロ〜

 

Tkinterを使おう

今回の授業で新しく使用するモジュールは、『Tkinter』の1つだけです。Tkinterは、グラフィカルなユーザインターフェイスを作成するためのモジュールで、これを使用することで簡単にブラウザ画面を使用することができます。

 

Tkinterのインポート

Pythonをインストールしたと同時にインストールされているので、改めてインストールする必要ありません。そのため『import』さえ、しておけば、コードの中で使えるようになります。

 

from tkinter import *

form tkinter import ttk

 

前回のモジュール読み込みとは書き方が違いますね。tkinterというモジュールには追加モジュールがあり、上記の書き方(form tkinter import *)で使用可能になります。また、2行目に書かれている『ttk』は、Tk 8.5で導入されたTk のテーマ付きウィジェットを使用する場合に使います。これにより、ttkウィジェットがTkウィジェットを上書きすることになります。(※ウィジェットとは、Web画面でユーザが使用するインターフェイスのことです。)

 

ウィジェットの作成

それではインポートしたTkinterを使ってウィジェットを作成していきます。tkinterは『root』という根を作成してTree構造でウィジェットを作成していくものなので、まずは『root』を作成します。

 

# rootの作成
root = Tk()
# タイトル名を入力
# 入力画面の一番上に書かれる文字になります
root.title(‘日付指定’)

# Frameの作成
frame1 = ttk.Frame(root)

# Frameの中身(部品)作成
label1 = ttk.Label(frame1, text=‘日付:’)

t = IntVar()

entry1 = ttk.Entry(frame1, width=15, textvariable=t)
button1 = ttk.Button(frame1, width=15, text=‘OK’, command=foo)
button2 = ttk.Button(frame1, width=15, text=‘Close’, command=root.destroy)

 

まずは、『root = Tk()』でrootの作成の作成をします。その次に『root.title(‘日付指定’)』でタイトル名を決めていきます。タイトルって何?って思う方は黒板を見てください。この部分に入れる言葉を’ ‘の中に入れてくださいね。

 

 

今回、使用する部品は、『Label』『Entry』『Button』です

 

『Label』とは、単純に文字の表示ですね。フレームの中に文字を表示することで、ユーザにメッセージを伝えることができます。今回は、日付を入力してもらいたいため『日付:』と入れてありますが、好きなように変更してもらって構いません。その後、変数『label1』に代入してありますが、最後に配置していきます。

 

『Entry』とは、文字を入力するボックスのことで、上の黒板で『0』と書かれている部分が『Entry』となります。ここにログ解析したい日付を『yyyymmdd』のフォーマットで入力させ、これをログ解析フォルダの検索に使用しますので、『textvariable=t』で変数『t』に代入しておきます。また、この『Entry』のボックスを自体を変数『entry1』に代入して、これも後で使います~!

 

最後に『Button』ですが、これは文字通りボタンですね。今回は、日付を入力された後に処理を実行させる『OK』ボタンと、ウィジェットを閉じる『Close』ボタンを作成します。

 

『OK』ボタンでを押下した際に、『command=foo』が実行されるようになっているのが、わかりますでしょうか?この『command』オプションが、『OK』ボタンを押下された際に関数『foo』が実行されるようになります。この関数『foo』については、後で出てきますので、覚えておいてください。次に『Close』ボタンですが、これも同じように『command』オプションを使用し、『command=root.destroy』とコードを作成することで、最初に作成した『root』をクローズすることができます。これらも同様に、『button1』『button2』の変数にそれぞれを代入しておきますね!

 

 

部品の配置

それでは先程作成した部品を配置していきましょう。先程、作成した部品を一度整理してみると以下でした。

 

 

これらを使って、部品の配置をしていくと以下のようなコードになります。

 

# 部品の配置
frame1.grid(sticky=(N,E,S,W))
label1.grid(row=1,column=1,sticky=E)
entry1.grid(row=1,column=2,sticky=W)
button1.grid(row=2,column=1,sticky=W)
button2.grid(row=2,column=2,sticky=W)

for child in frame1.winfo_children():
    child.grid_configure(padx=5, pady=5)

root.mainloop()

 

まずフレームを定義しますが、『grid』オプションで配置を指定していきます。『sticky=(N,E,S,W)』で書かれている『N、E、S、W』は、『北、東、南、西』を表しており、配置に使っていきます。

 

次に、『label1.grid(row=1,column=1,sticky=E)』が書かれているかと思いますが、これは、変数『label1』を1行目(row=1)の1列目(column=1)に配置するように書かれています。また、配置した場所のうち、左詰め(sticky=E)で書かれるようになっています。このような感じで配置を決めていくと以下のようになります。(配置については、お好みに決めてもらっていいと思います。)

 

 

 

ディレクトリ検索

それでは、ディレクトリ検索に移りたいと思います。先程、関数『foo』が出てきたと思いますが、これを使っていきます。

 

def foo():
days = ‘%s‘  % t.get()
DATA_DIR = (‘./log/’ + days)
files = glob.glob(os.path.join(DATA_DIR, ‘*.txt’))

 

これを実行すると、先程の『Entry1』に入力された値が『t』に代入されていますので、これを使ってディレクトリ検索を行いますが、一度、変数『days』に入れなおして使います。その値を『./log/』の後ろに付けて『./log/20180701』とした値を変数『DATA_DIR』に代入します。これがログの保存先となるので、このフォルダ配下に保存されているすべてのテキストファイルの読み込みをしていくようになります。ここから先程は、前回のコードの続きとなります。

 

過去データの削除

前回の授業で教えた際に、CSVファイルを作成できるようになったかと思いますが、複数回実行すると、前回のデータに追記される形になり、思う通りの結果にならなかったと思います。それを避けるためのコードとして以下を入れると、前回までのデータが削除され、一から作成されるようになり重複を避けることができます。

 

# 過去データの削除
if os.path.exists(days + ‘_log_data.csv’) :
    os.remove(days + ‘_log_data.csv’)

 

 

ここまでのコード紹介

最後に前回までのコードと合わせて記載しておきますね。以下のようなコードになっていれば問題と思います。想定通りの動作にならない場合は、フォルダ構造等も含めて確認してもらえればと思います。

 

import glob
import os
import csv
from tkinter import *
from tkinter import ttk

# 2018年7月1日のログから抽出
# days = ‘20180701’
# DATA_DIR = (‘./log/’ + days)
# print(DATA_DIR)
# /log/20180701の配下に保存されているテキストファイルを変数「files」に入れる
# files = glob.glob(os.path.join(DATA_DIR, ‘*.txt’))

def foo():
days = ‘%s‘  % t.get()
DATA_DIR = (‘./log/’ + days)
files = glob.glob(os.path.join(DATA_DIR, ‘*.txt’))

    # 過去データの削除
    if os.path.exists(days + ‘_log_data.csv’) :
    os.remove(days + ‘_log_data.csv’)

    # 「files」から1ファイルずつOpenしていく
    for file in files:
        with open(file) as f:
            # openしたファイルから1行ずつ読み込んでいく
            lines = f.readlines()
            lines_strip = [line.strip() for line in lines]

            # ログ取得時間の取得
            # 「Time source is user configuration」という文字が含まれている行を抜き出して
            # 変数「l_time」に代入する
            l_time = [line for line in lines_strip if ‘Time source is user configuration’ in line]
            # 「l_time」の中に保存された1行を空白セルで区切る
            # 例)「Time source is user configuration, 00:00:00.963 UTC Sun Jul 1 2018」
            time_sp = str(l_time).split(‘ ‘)
            # 空白セルで区切られた1行から6月番目だけを抽出し、「time」に代入する
            time = time_sp[5::6]

            #Outputデータ量の取得
            # 「5 minute output rate」という文字が含まれている行を抜き出して
            # 変数「l_opt」に代入する
            l_opt = [line for line in lines_strip if ‘5 minute output rate’ in line]
            # 「l_opt」の中に保存された1行を空白セルで区切る
            # 例)「5 minute output rate 2367 bits/sec, 21 packets/sec」
            opt_sp = str(l_opt).split(‘ ‘)
            # 空白セルで区切られた1行から5月番目だけを抽出し、「opt」に代入する
            opt = opt_sp[4::5]

            i = 0
            for tm in time:
                 # print(tm, opt[i])
                 # 先程抽出した、変数「time」と変数「opt」を組み合わせて「table」に代入していく
                 # 間に「,」を入れることでcsv化した時に列を分割させる
                table = (tm, ‘,’, opt[i])
                # 日付入りのCSVファイルを作成する
                # オプションで「a」を選択することで上書きモードでオープン
                f_log = open(days + ‘_log_data.csv’, ‘a’)
                # csvファイルに先程の「table」を書き込む
                f_log.writelines(table)
                # 「’\n’」を入れることで改行させる
                f_log.writelines(\n)
                # 次のデータに進む
                i += 1
                # csvファイルを閉じる
                f_log.close()

def close_window(root):
    root.destroy()

# rootの作成
root = Tk()
root.title(‘日付指定’)
frame1 = ttk.Frame(root)
label1 = ttk.Label(frame1, text=‘日付:’)

t = IntVar()

entry1 = ttk.Entry(frame1, width=15, textvariable=t)
button1 = ttk.Button(frame1, width=15, text=‘OK’, command=foo)
button2 = ttk.Button(frame1, width=15, text=‘Close’, command=root.destroy)

frame1.grid(sticky=(N,E,S,W))
label1.grid(row=1,column=1,sticky=E)
entry1.grid(row=1,column=2,sticky=E)
button1.grid(row=2,column=1,sticky=E)
button2.grid(row=2,column=2,sticky=E)

for child in frame1.winfo_children():
    child.grid_configure(padx=5, pady=5)

root.mainloop()

 

 

まとめ

ベル

今回の授業は、いかがだったでしょうか?Tkinterを使ってユーザインターフェイスを作成し、取得したログをユーザが指定したフォルダからCSV化することができるようになりました。次は、CSVファイルからグラフを作成するコードを書いていこうと思いますので、引き続き頑張っていきましょう!!

【Pythonでログ解析(7)】

Pythonでログ解析(7) 〜CSVファイルからグラフを作成する!〜

 

いちばんやさしいPythonの教本

いちばんやさしいPythonの教本 人気講師が教える基礎からサーバサイド開発まで【電子書籍】[ 鈴木たかのり ]

価格:1,497円
(2018/7/19 00:20時点)
感想(0件)


詳細!Python3入門ノート

詳細!Python3入門ノート [ 大重美幸 ]

価格:2,894円
(2018/7/19 00:15時点)
感想(1件)

ラズベリーパイ3B+

ラズベリーパイ3 B コンピュータボード

価格:5,689円
(2018/7/19 00:18時点)
感想(0件)

商品紹介

ネットワークエンジニアとして仕事していく上で、必要となる商品を紹介させていただいています。よかったら、こちらも読んでみてください。きっと何か面白いものが見つかると思いますよ!

商品紹介 ~ネットワークエンジニアの便利アイテム!~

商品紹介 ~職場で使える便利商品①~

商品紹介 ~ネットワークのお勉強に役立つ商品①~

無線LAN商品の紹介 ~Arubaで遊ぼう!~

Follow me!

Pythonでログ解析(6) 〜ログ解析対象日を入力させるまで〜” に対して1件のコメントがあります。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です