広告

第4回基礎から学ぶPython入門ーCSVファイル読込 前編ー

どうもKuboです。

本日は、第4回ということで、前回の最後に言ったように簡単なプログラムを書いてその中身を解説していきたいと思います。

広告

今回のプログラム

今回は、CSVファイルを読込操作するプログラムを書きたいと思います。

CSVファイルとは “Comma Separated Value” の略で、データをカンマ(” , “)区切った値の事です。アプリケーション間でデータをやり取りする際に使われます。CSV形式で保存されたファイルを「CSVファイル」と呼びます。

読込CSVファイルは、「疑似個人情報データ生成サービス」という実在しない個人情報データをランダムに生成してくれるサービスを使って作成しようと思います。

疑似とはいえ非常にリアルにありそうなデータを生成してくれるので非常に面白いサービスですね。

疑似個人情報データ生成サービス
主にアプリケーションの開発/試験の際のテ...

CSVファイル生成条件

出力項目名条件
連番開始値:1
氏名漢字
カタカナ
性別出力値:男/女
生年月日日付書式:YYYY/MM/DD
年齢
乱数最小値:0 最大値:100

出力データ

出力された「personal_infomation.csv」の1行目の「乱数」をテストの点数に見立てて「点数」に置き換えました。

連番,氏名,氏名(カタカナ),性別,生年月日,年齢,点数
1,小高晴廉,オダカセレン,男,1976/03/17,43,16
2,那須冨士雄,ナスフジオ,男,1979/10/01,39,54
3,内山大貴,ウチヤマダイキ,男,1972/11/21,46,100
4,市村一路,イチムラカズミチ,男,1984/08/04,34,28
5,阪本玲二,サカモトレイジ,男,1983/11/14,35,45
6,大西葉菜,オオニシハナ,女,2009/03/12,10,69
7,丸田葉子,マルタヨウコ,女,1973/08/15,45,59
8,大滝真吉,オオタキシンキチ,男,1982/08/03,36,33
9,青木宗男,アオキムネオ,男,1982/06/18,36,19
10,原口勝巳,ハラグチカツミ,男,1974/08/30,44,43
11,棚橋真春,タナハシマハル,女,2007/12/14,11,88
12,榎本真琴,エノモトマコト,女,1985/09/12,33,82
13,門田重彦,カドタシゲヒコ,男,1988/06/06,31,2
14,富永芳美,トミナガヨシミ,女,1978/01/09,41,54
15,栗山春華,クリヤマハルカ,女,1977/11/13,41,90
16,磯野克哉,イソノカツヤ,男,1983/07/05,35,12
17,土谷幸夫,ツチヤユキオ,男,1985/07/20,33,37
18,坂元雪乃,サカモトユキノ,女,1990/10/28,28,81
19,足立雪絵,アダチユキエ,女,1971/06/01,48,5
20,岩城哲也,イワキテツヤ,男,2002/10/21,16,38
21,大和田咲奈,オオワダサナ,女,1975/05/28,44,22
22,梅木咲菜子,ウメキサナコ,女,2001/12/13,17,19
23,横尾梨乃,ヨコオリノ,女,1984/12/26,34,77
24,遠藤卓也,エンドウタクヤ,男,1991/03/16,28,41
25,山田航賀,ヤマダコウガ,男,2009/04/21,10,18
26,古屋颯明,フルヤソウメイ,男,2005/02/25,14,15
27,福永愛莉,フクナガアイリ,女,1977/04/25,42,14
28,細田喜久雄,ホソダキクオ,男,1974/08/04,44,26
29,今晴久,コンハルヒサ,男,1979/04/22,40,8
30,杉本雄太,スギモトユウタ,男,1980/01/03,39,86
31,北忠男,キタタダオ,男,1992/05/31,27,39
32,鮫島由子,サメジマユウコ,女,1976/11/26,42,45
33,深田義之,フカダヨシユキ,男,1984/09/17,34,13
34,三村楓賀,ミムラフウガ,男,2005/12/31,13,74
35,沖田実結,オキタミユ,女,1983/01/06,36,35
36,浅見勇仁,アサミユウジン,男,1993/07/11,25,5
37,神野照,カンノテル,女,1976/06/18,42,36
38,矢田義美,ヤダヨシミ,女,1985/09/13,33,69
39,中森常雄,ナカモリツネオ,男,1984/07/15,34,30
40,永瀬真理子,ナガセマリコ,女,1975/12/06,43,10
41,加瀬綾,カセアヤ,女,1996/10/22,22,91
42,高山裕子,タカヤマヒロコ,女,1993/06/15,25,15
43,松野敏雄,マツノトシオ,男,1971/08/19,47,13
44,矢口享,ヤグチトオル,男,1991/01/23,28,3
45,村井正春,ムライマサハル,男,1993/07/27,25,82
46,沢一太郎,サワイチタロウ,男,1980/02/04,39,39
47,岩本栞,イワモトシオリ,女,1985/09/29,33,41
48,香坂翔偉,コウサカカイ,男,2000/03/13,19,99
49,牧紗綾子,マキサヤコ,女,2000/07/13,18,10
50,北村芽愛子,キタムラメイコ,女,1995/04/27,24,2

本当に居そうなデータですね、私は、自分の名前がでないか30分ほど再出力繰り返しちゃいました(笑)

プログラム仕様

今回は、引数にCSVファイルのパス付きの名前と基準となる点数を渡しCSVファイルから基準点以上の一覧が出るようなプログラムを作成します。

引数とは実行するプログラムに渡す値を指します。逆にプログラムから帰ってくる値を”戻り値”と言います。

プログラム作成例

今回のプログラムを書いてみました、他にも方法はあり、もっと効率的なもっと処理速度が早い書き方があるかもしれませんがここでは置いといて優しい目でみてください。

import os
import sys
import csv

args = sys.argv

#引数のチェック1
if not len( args ) > 2 :
  print("パラメータが不足しています。")
  sys.exit()
#引数のチェック2
elif not os.path.exists( args[1] ):
  print("ファイルが存在しません")
  sys.exit()
#引数のチェック3
elif not str.isdecimal(args[2]):
  print("第2引数は数字を指定してください。")
  sys.exit()

#ファイルを開く
csv_file = open(args[1], "r", encoding="utf_8")

#辞書形式に展開
csv_dict = csv.DictReader(csv_file, delimiter=",", doublequote=True, lineterminator="\r\n", quotechar='"', skipinitialspace=True)

#ヘッダー出力
print('氏名'.ljust(10) + "\t性別\t年齢\t点数" )
print('-------------------------------------' )

#1行づつループ
for row in csv_dict:
  #第2引数の数値以上のみprint
  if int( row['点数'] ) >= int(args[2])  :
    print( row['氏名'].ljust(10) + "\t" + row['性別'] + "\t" +  row['年齢'] + "\t" + row['点数'].rjust(3) )

コードをhoge.pyとして保存します。

サーバ上にpythonディレクトリを作成しこの様に配置しました。

python
 ├─hoge.py
 └─personal_infomation.csv

実行

そして実行してみます。

$ python3 hoge.py personal_infomation.csv 40
氏名            性別    年齢    点数
-------------------------------------
那須冨士雄      男      39       54
内山大貴        男      46      100
阪本玲二        男      35       45
大西葉菜        女      10       69
丸田葉子        女      45       59
原口勝巳        男      44       43
棚橋真春        女      11       88
榎本真琴        女      33       82
富永芳美        女      41       54
栗山春華        女      41       90
坂元雪乃        女      28       81
横尾梨乃        女      34       77
遠藤卓也        男      28       41
杉本雄太        男      39       86
鮫島由子        女      42       45
三村楓賀        男      13       74
矢田義美        女      33       69
加瀬綾          女      22       91
村井正春        男      25       82
岩本栞          女      33       41
香坂翔偉        男      19       99

解説

それでは書いたコードを1行づつ説明していきます。

標準ライブラリ読込

まずは、コードの先頭3行ですが、これは標準ライブラリと呼ばれるpythonをインストールするだけで使えるようになるプログラム群です。

他にも様々な標準ライブラリが存在しますが、自分が書くプログラムで必要な分を読み込んで使います。

import sys
import csv
import os

他の標準ライブラリについては以下のドキュメントを参考にしてください。

https://docs.python.org/ja/3.7/library/index.html

引数を受ける

コードの5行目で先程標準ライブラリから追加したsysを使って引数を受け取っています。

args = sys.argv

このargsをprintしてみると以下の様にデータが入っています。

 ['hoge.py', 'personal_infomation.csv', '50']

これはリストと呼ばれる変数です。第2回で変数とは値を入れる箱の様なものと表現しましたが、このリストは、箱の中に更に仕切りがある状態で通常の変数と値は1対1の関係ですが、このリストは、1対nの関係になります。

データの1個目には、hoge.pyで実行したプログラムファイル名が入ります。

続いて2個目以降は、プログラム実行時に渡した引数が入っています。

これで引数をプログラムで操作できるようになりました。

引数のチェック

#引数のチェック1
if not len( args ) > 2 :
  print("パラメータが不足しています。")
  sys.exit()
#引数のチェック2
elif not os.path.exists( args[1] ):
  print("ファイルが存在しません")
  sys.exit()
#引数のチェック3
elif not str.isdecimal(args[2]):
  print("第2引数は数字を指定してください。")
  sys.exit()

続いて今度は7行目以降の処理ですが、受け取った引数が想定通りのものかチェックを行っています。

一般的にこの引数のチェック処理をバリデーション ( validation )または バリデート (validate)と呼びます。

引数チェック1

最初のif文ですが、変数”args”のリストの個数が2つより多いかを判定してnotをつけて判定を反転しています。

先程の変数=箱の例えで説明しますと箱の中が仕切りにより何個で区切られているかそれが2つより多い場合、真(条件が成立している)

2つ以下の場合は、偽(条件が成立してない)となります。その条件式にnotをつけるので真と偽が反転して箱の中が2つより多い場合、真/箱の中が2つ以下の場合、偽となります。

条件式が真となった場合にif文の中の処理を実行することになります。

if文の中ではprintでメッセージを出力しsys.exit()でプログラムを終了しています。

このリストの個数を取得するlenとメッセージを出力するprintは標準ライブラリの中で組み込み関数と呼ばれimportで読込む必要がない関数となります。

組み込み関数に関しては以下を参考にしてください、

https://docs.python.org/ja/3/library/functions.html

引数チェック2

続いて引数チェック2の処理ですが、os.path.existsに受け取った引数1個目を渡してファイルが存在するかチェックを行いファイルが存在しない場合にメッセージを出力して終了しています。

リストは、”リスト[n]”の形で参照することが出来ます。nの開始は0からなのでリストの2つ目を参照したい場合は、1となることを注意してください。

引数チェック3

続いて引数チェック3の処理ですが、str.isdecimalを使って文字列が数字であるかを判定して数字以外の場合にメッセージを出力して終了しています。

str.isdecimalも標準ライブラリの中で組み込み型と呼ばれimportで読込む必要がありません。

お詫び

書いていて思った以上に説明が多くなり今回はここで終了とさせてください。

タイトルがCSVファイルの読込なのにまだ読み込んでない

次回もまた読んで頂ければ幸いです。

Kuboでした。

コメント

タイトルとURLをコピーしました