Python では、リスト(配列)の保存、読み出し、HTML での出力が簡単にできます。
プログラムを作っていてとても便利だと実感していますので、コピー&ペースト用にサンプルコードをまとめておきます。
以下の環境で動作確認をしています。
環境: Windows 10、Python 3(+ Anaconda 3)
また、pickle、pandas を使用しています(環境によって、インストールが必要です)。
活用メリット
・ リストを使ったプログラムを作っていて、処理が複雑になってきたとき、リストをそのまま保存しておきます。そして、次回から(または、別のスクリプトから)、そのリストを読みだせば、データ型などを気にすることなくそのままプログラミングを続行できるため、とても効率的です。
・ csv ファイルや json ファイルなどを使用せずに、直接、配列(リスト)のまま、ファイルの読み書きができます。
・ データの型を気にせずに読み書きできます。これにより、余計なバグ、予想外の不具合が入り込む余地を減らすことができます。
・ 各読み書きは、実質、1~2行で実行できます。
・ また、配列のデータをすべて html で出力してしまえば、すべてのデータをブラウザから確認できます。
・ 例えば、プログラムを作っているとき、コンソールや開発環境のみでデータを確認しながらデバッグするのに比べると、各段に開発効率が上がります。
使い方
・ 任意のフォルダを作成し、フォルダの中に下記のサンプルコードを貼りつけたスクリプト(例:list1.py)を作成してください。コマンドプロンプト等から実行してみてください。
・ リスト(配列)を読み書きする部分、HTML を出力する部分を def …で関数にしています。
・ その他、配列を扱う際によく使う、重複の削除やソート等の処理も入れてあります。
必要な個所をコピー&ペーストして活用してください。
サンプルコードの説明
・ 最初に os, glob などをインポートします。
・ pickle はリストの読み書きのため使います。
・ itemgetter はリストのソートで使います。
・ pandas は html の書き出しで使います。
・ def としたところで、リストの読み書き、html の出力をする関数を定義しています。
・ def set1() は、リストの重複をなくすための関数です。リストの処理でよく使うため定義しています。
・ def sort1() は、リストのソートをするための関数です。
・ スクリプトを実行すると、まず、path1 で python スクリプトの入っているフォルダ(パス)を取得します。このフォルダ内で読み書きをするようにします。
・ a1, a2 としているところで、リスト(配列)の一例を定義しています(2列×5行と、2列×6行)。うまく動いたら、書き換えてみてください。
・ a1 = a1 + a2 で、2つのリストを結合しています。
ここで、a1 と a2 には、意図的に重複する要素([5, 25])を入れてあります。
・ そこで、set1()で重複する要素を削除しています。
・ sort1( a1, 0 ) で、リストをソートしています。”0″ は、0 列目でソートする、の意味です。
・ a1.reverse() はリストを逆順に並べる場合の記載例です。コメントアウトしていますが、”# ” の記載を削除して動作を確認してみてください。
・ つぎに、file1 で出力ファイル名(list1.txt)を定義して、write_list1() 関数でリストを書き出しています。(ファイル名の拡張子は .txt としましたが byte で読み書きするためテキストエディタで開くと文字化けしていると思いますが、気にしないでください。)
・ つぎに html ファイル形式で出力しています。list1.html というファイルが生成されると思いますので、ダブルクリックしてブラウザで開いてみてください。
・ ここで、a0 としているのは、ヘッダーです。
リスト a1 が、2列×…行の配列になっていますので、2列のヘッダーの文字列(x1, y1)を定義しています。この文字列が html の冒頭の行部分に表示されます。サンプルコードは、y1 = x1^2 となる数値の羅列を扱っている事例です。
・ つぎに、いったん保存した list1.txt を再度読みだして、print() 関数で内容を表示しています。
活用の具体例
・ 例えば、ログデータなどを日々取得しているとき、毎回、すべてのログデータを呼び出していると処理が重くなります。また、Python スクリプトの実行時、同じ処理を毎回繰り返すのは無駄です。
そこで、ログデータやファイル名には日付をつけるなどルールを決め、過去に集計したリスト(★)はそのままリストごと保存するようにします。
そして、Python スクリプトでは、最近の日付のついたファイルのみ、更新のあったファイルのみ集計するようにして、読み出したリスト(★)と結合するようにします。
・ 重複があったときは、スクリプトで示したように set1() で削除し、sort1() でソートすればアップデートが完成です。
・ また、処理中のデータがどうなっているのか確認したい場合は、html で書き出してしまえば、すべてのデータを簡単に参照できます。リストのデータ量が大きくなったとき、コンソール画面でミスがないかを確認するのは煩雑ですが、html で書き出してしまえば、確認が簡単です。
・ サンプルスクリプトでは、整数を保存する事例としました。しかし、文字列であっても、float であっても気にせずに、そのまま読み書きができます。
・ また、サンプルスクリプトでは、(リストの書き出し)→ (リストの読み込み)の順番で記載しています。
しかしながら、実際の使用場面では、過去に処理したデータをいったん保存しておき、(リストの読み込み)→(追加分を結合)→(リストの保存)の流れになると思います。
まとめ
Python のリストの保存、読み出し、html ファイルでの保存についてまとめました。
データが増えてきて、スクリプトの処理が複雑になってきたなと思ったとき、活用を検討してみてください。1行程度で読み書きでき、とても便利だと思いましたので、ポイントを書き出してみました。
なお、Python でスクリプトを書いて HTML ファイルを出力する事例等について、下記の関連リンクにまとめています。もし興味のある場合は、参照してみてください。
関連リンク
・ Excel ファイルを読み込む
・ テキストファイルを入出力する 【Python】
・ 配列(リスト)の読み書き、HTML の出力 【Python】
・ Python で HTML ファイルを出力する
サンプルコード
# -*- coding: utf-8 -*-
import os
import glob
import pickle
from operator import itemgetter
import pandas as pd1
def read_list1( file1 ): # read list
f1 = open( file1, "rb" )
a1 = pickle.load( f1 )
return a1
def write_list1( file1, a1 ): # write list
f1 = open( file1, 'wb' )
pickle.dump( a1, f1 )
def write_html1( file1, a0, a1 ): # write html
df1 = pd1.DataFrame( a1 )
df1.columns= a0
df1.to_html( file1 )
def set1( a1 ):
a2 = list(map(list, set(map(tuple, a1)))) # remove duplicated data
return a2
def sort1( a1, n1 ):
a1.sort( key=itemgetter(n1) )
return a1
path1 = os.path.dirname(__file__) + "/"
a1 = [ [1, 1], [2, 4], [3, 9], [4, 16], [5, 25] ] # list 1
a2 = [ [5, 25], [6, 36], [7, 49], [8, 64], [9, 81], [10, 100] ] # list 2
a1 = a1 + a2
a1 = set1( a1 ) # remove duplicated data
a1 = sort1( a1, 0 ) # sort
# a1.reverse() # reverse
file1 = path1 + "list1.txt"
write_list1( file1, a1 ) # write list
file1 = path1 + "list1.html"
a0 = [ "x1", "y1" ] # header
write_html1( file1, a0, a1 ) # write html
file1 = path1 + "list1.txt"
a1 = read_list1( file1 ) # read list
print( a1 )