Pythonを使ってデータを収集して加工してグラフ化するための一連の流れで、必要なったモジュールや気の付いた事を書いてみます。
後述のpythonスクリプトは、(カッコ内)のモジュールを使用して、下記の流れで進んで行きます。
- コマンドライン引数からディレクトリ名を取得し、ディレクトリ内のファイル名を取得する。(sys, os)
- ファイル名から、サイズと、タイムスタンプを取得する。(os, datetime)
- 取得した情報をデーターベースに入れるる。(sqlite3)
- サイズをキーにして降順にソートする。(sqlite3)
- csvファイルに出力する。(csv)
- csvから必要なデータを読み込んで結果をグラフで表示する。(pandas, matplotlib, plotly)
(一番試行錯誤した事)
64bit Windowsの環境下でAnaconda5.0.1 をダウンロードして、Python3.6.3を動作させているのですが、64bit版の Anacondaでは、plotlyモジュールをダウンロードできませんでした。また、Tensorflowは、64bit Anacondaでしかダウンロードできないようです。
(やり残した事)
処理するファイル名に日本語が混じっているとpandasでparserエラーが起こる事を回避していません。また、試しておりませんがコマンドラインに日本語交じりのディレクトリパスを指定して正常に認識されないかもしれません。
(感想)
今回は、Python習得のきっかけを持つ事ができて有意義でした。Pythonは、膨大なモジュールを選択する事ができ、僅かの記述でデータを加工できるのがとても魅力ですね。次回はインターネット上からデータを取得して加工して出力できるようにしたく思います。特に地図関係のAPIに触れたく思います。
(実行方法)
下記のpythonスクリプトを、fsizechart5.pyに保存し、
python fsizechart5.py directryname
で実行します。
(注意点)
このpythonスクリプトでは、再帰的にディレクトリを探索します。異なるディレクトリに同名のファイルが存在した場合は、チャートの表示では1つにまとめられてサイズの小さい方で表示されます。また、このpythonスクリプトを一度実行するとdatabase.dbと、output.csvをカレントディレクトリに作成します。二度目以降は、database.dbを削除してから実行しないと途中終了します。
初学者の書いたスクリプトですので、注意点にもありますように動作の正確性は保証できません。もしも何かお気づきの点がありましたら、コメント欄にお願いします。
#fsizechart5.py # -*- coding: utf-8 -*- import os import sys import datetime import sqlite3 import csv import pandas as pd import plotly csvname = 'output.csv' dbname = 'database.db' #チャートに描画するファイルの数 numoffiles = 5 #引数の取得のための初期化 argvs = sys.argv argc = len(argvs) if (argc != 2): print ('Usage: # python %s directory-path' % argvs[0]) quit() #データーベースの取得 con = sqlite3.connect(dbname) cur = con.cursor() #データーベースのテーブル(ファイル名、サイズ、日付と時間)を作成 create_table = '''create table files (filepath varchar(256), size int, datetime varchar(32))''' cur.execute(create_table) #引数の取得 targetpath = argvs[1] #再帰的にファイルパスを取得し、データベースへ書き込んでいく SEPARATOR = os.sep def printdir(dirpath): for item in os.listdir(dirpath): filepath = dirpath + SEPARATOR + item if os.path.isdir(filepath): printdir(filepath) else: dt = datetime.datetime.fromtimestamp(os.stat(filepath).st_mtime) size = os.path.getsize(filepath) date = dt.strftime('%Y-%m-%d %H:%M:%S') sql = 'insert into files (filepath, size, datetime) values (?,?,?)' user = (item, size, date) cur.execute(sql, user) #関数の実行 printdir(targetpath) #データーベースの更新。 con.commit() #サイズをキーにして降順にソート select_sql = 'select * from files order by size desc' #データーベースからデータを読み出しながらcsvに書き込んで行く。 #('filename','filesize','datetime') header=['filename','filesize','datetime'] fcsv = open(csvname, 'w') writer = csv.writer(fcsv, lineterminator='\n') writer.writerow(header) for row in cur.execute(select_sql): writer.writerow(row) #csvと、データーベースのClose fcsv.close() con.close() #csvからデータを読み出す。 df = pd.read_csv(csvname) df_2 = df.copy() #上位5位の、'filename','filesize'だけを取り出す。 df_ns = df_2.iloc[:numoffiles, :2] #チャートの設定1 data = [ plotly.graph_objs.Bar(x=df_ns["filename"], y=df_ns["filesize"]) ] #チャートの設定2 layout = plotly.graph_objs.Layout( title="FileName And Size", legend={"x":0.8, "y":0.1}, xaxis={"title":"FileName"}, yaxis={"title":"Size"}, ) #チャートを描く fig = plotly.graph_objs.Figure(data=data, layout=layout) #plotly.offline.iplot(fig) plotly.offline.plot(fig)