pythonの勉強-google spread sheet内のデータ操作
作成したプログラム
pythonのプログラムを通してgoogle spread sheetのデータを操作するプログラム。
使用したライブラリはgspread。
今回はWindowsのイベントビューアーのWindowsログをCSV形式で保存したものをgoogle spread sheetで読み込み保存。google spread sheet内に保存したWindowsログのデータの中で欲しいイベントIDのデータを抽出し別のシートに書き込むプログラムを作成した。
具体的な動作
WindowsログのデータのイベントIDとそのイベントの発生した時刻を読み込む。
抽出したいイベントIDを設定しWindowsログから抽出する。
書き込み用のシートに抽出したWindowsログを書き込む。
google spread sheet ワークブックの構成
google spread sheetのワークブックに3つのシートを予め作成しておく。
各シートの役割は
①操作する元のデータのあるシート(シート名:log)
Windows10の場合
アプリ
↓
Windows管理ツール
↓
イベントビューアー
↓
Windowsログ
↓
システムを選択
↓
全てのイベントを名前をつけて保存(CSV形式)
↓
保存したものをgoogle spread sheetで読み込み保存しておく。
②データを操作し書き込むシート(シート名:write)
最初はまっさらなシート。
プログラムを実行すると画像のように抽出したイベントIDと時刻が書き込まれる。
今回の場合は7001(Windowsの起動)と7002(シャットダウン)を抽出。
③書き込むデータの条件を設定するシート(シート名:arg)
B列に抽出したいイベントIDを記述しておく。
ソースコード
# -*- coding: utf-8 -*- import sys import gspread from oauth2client.service_account import ServiceAccountCredentials import datetime #認証 scope = ["https://spreadsheets.google.com/feeds"] credentials = ServiceAccountCredentials.from_json_keyfile_name("J-sonファイルの名前", scope) gc = gspread.authorize(credentials) wb = gc.open('windows_log') #書き込むワークブック wks_read = wb.worksheet('log') #元のwindows_logデータのあるシート wks_write = wb.worksheet('write') #取得したいwindows_logデータを書きこむシート wks_arg = wb.worksheet('arg') #取得したいevent_idを記載するシート get_event_id = wks_arg.col_values(2) #取得したいevent_idを記載するシートからevent_idを取得 time_log = wks_read.col_values(2) #元のwindows_logデータのあるシートから時間のデータを取得 #logデータの行数を数える def count_log_col(col,time_log): for i in time_log: if i == '': break col+= 1 return col-1 #取得したいevent_idの行数を数える def count_event_col(col2,get_event_id): for i in get_event_id: if i == '': break col2+= 1 return col2-1 #各event_idの時間ログの取得 def make_log_list(i, j, col): event_time_log = [] event_id_log = wks_read.col_values(4) while j <= col: if event_id_log[j] == get_event_id[i]: event_time_log.append(time_log[j]) j+=1 return (event_time_log, get_event_id) #google_spread_sheetにログの書き込み def write_log(i, j, event_time_log): for e_t_l in event_time_log: wks_write.update_cell(i,j,event_time_log[i-2]) i+=1 #google_spread_sheetの1列目に取得したevent_idの書き込み def write_event_id(i,j,get_event_id): for event_id in get_event_id: if get_event_id[j].isdigit() == True: wks_write.update_cell(i,j,int(get_event_id[j])) j+=1 #各関数を実行しwindows_logを取得しgoogle_spread_sheetに書き込み def get_win_log_sys(i,j): win_log =[] col = count_log_col(0,time_log) col2 = count_event_col(0,get_event_id) while i<=col2: win_log, g_e_i = make_log_list(i,1,col) write_log(2,j,win_log) write_event_id(1,j,g_e_i) i+=1 j+=1 del win_log[:] get_win_log_sys(1,1)
感想
自分的には結構苦労して作った感があったけど、実際の動作はかなりチープなものができた印象(わざわざプログラムで書くまでもなかったかな…)。
反省点はgspread内の行数を数えるための関数col_countのがうまく動作しなかったため、logデータと取得したいevent_idの行数のカウントをfor文で代用したところと、自分で命名した変数名、関数名がわかりずらいの2点。