見出し画像

Python と Excel と SQLite3 #04



「こんなこと」ってどんなこと?

実際に作成したアクプリケーションの、サイズ

私は、自分なりに納得できるものを作りながら、記事を書きたいと思っています。ここ数日、試行錯誤しながら、「ちゃんと動くアプリ」を作っていました。上の画像は、実際に作成したアプリの一覧です。どれもアプリもエクセルを扱っているのですが、ごらんのとおりサイズは、6MBから7MBのあいだになっています。


エクセルファイルを読み込んで処理し、別のエクセルファイルを自動的に作成して保存する、という学校現場に「あるある」の話

学校現場で「あるある」の話なのですが、具体的には「部活動の大会の準備」に関する作業になります。

わたしが担当している部活動は水泳部なのですが、市内には20校以上の中学校があり、それぞれの学校から選手が出場します。常設の水泳部があるところ、大会のときだけ特設の部活動として参加するところ等、さまざまですが、選手の個人情報を登録して、大会のプログラムを作成し、それぞれの学校に事前にPDFファイルとして送るということになります。

水泳部に所属する生徒は、外部のスイミングクラブに通っている生徒も少なくありません。学校の部活動だけで頑張る生徒もいれば、学校には部活動がないのでスイミングクラブだけで頑張る生徒もいます。いろいろ事情があって、年度の途中から参加したり、特定の大会のみ参加したり、参加しなかったりといろいろです。

そこで、各校の顧問の先生(場合によっては教頭先生が仕事を引き受けてくださることもあります)は、とりあえず産科そうな生徒の名簿を作成し、その名簿から実際のエントリーを入力していくということにしています。

以前は、完全に手書きで作業していたのですが、作業効率をよくすることとミスを減らすためにエクセルファイルを活用することになりました。上に書いたとおり、まず生徒の名簿を作ります。生徒には、それぞれの学校ごとに番号をつけてもらいます。大会にエントリーするときには、その番号を利用して、種目や泳ぐ距離やエントリー・タイムを記入してもらい、市内のイントラネットを利用して大会事務局(つまり高瀬が所属する学校)に送付してもらいます。そして、大会プログラムを作成することになります。

残念ながらミスがたくさん

先生方から送っていただいたファイルが完璧なものであれば、仕事は比較的順調に進むのですが、なにしろ特設の部活動もたくさんありますので、先生方は慣れていません。エントリー用のエクセルファイルは、なるべくミスが少なくなるように工夫してありますが、それでも人為的なミスは発生します。

いちばんよくあるミスは、種目や距離の間違いです。たとえば、6月や7月に実施される大会では 400m個人メドレーという種目がありますが、8月に実施される新人戦では 400m個人メドレーを実施しません。しかし、うっかりすると、この種目に選手をエントリーしてしまったりします。あるいは、新人戦のときには、3年生はすでに引退していますので出場できないのですが、なぜか3年生が含まれていたりします。誕生日も登録することになっているのですが、誕生日の間違いも比較的たくさんあります。エントリーするときには、種目と距離とエントリータイムが必要ですが、種目と距離だけが記入してあって、タイムが記入していない場合もあります。これは、ミスで記入しなかったケースと、出場しないことになったのでタイムを消したケースと両方考えられます。

ミスを乗り越えてファイルをまとめる

上に述べたようなミスをチェックしながら、全体で20個を超えるエクセルシートを、ひとつのシートにまとめていかなければなりません。出場選手は200人程度。エントリーの総数は300件を超えます。

シートを開いてコピーし、「まとめのシート」に貼り付けていくという作業を繰り返します。それぞれの学校ごとに生徒の番号がありますから、同じ番号が重複する場合もあります。いま貼り付けているシートがどこの学校のシートなのかを確認しながら、作業するのですが、だんだん頭がボオオっとしてきます。どこかで間違えてしまったら、「いったいどこで間違えたのか」がわからないことが多いので、結局最初からやり直しになります。苦労して、全体をひとつにまとめたあとで、「すいません。ウチの学校のデータが間違っていました」と差し替えになると、また最初からやりなおしということも、過去にはありました。


個人情報は持ち出せない

多くのエクセルファイルを一度に扱う必要があるので、単独のエクセルファイルのマクロで作業するのは難しいと思われます(不可能ではないと思いますが)。そこで、Python を使って作業しようということになるのですが、おおきな壁があります。それは、水泳大会のエントリー情報は、生徒の個人情報ですから、学校の外に持ち出せないということです。

逆に、学校のコンピュータで Python を使うことを考えてみても、そもそも Python のシステムをインストールすることができません。管理者権限が必要なプログラムをインストールすることは、エンドユーザーには許可されていません。

したがって、一連の作業ができるプログラムを作成し、「実行型のファイル」(デスクトップ・アプリケーション)の形にして、作業を学校のコンピュータで行う必要があります。このとき、実行型のファイルがあまりに大きいものだと、困ってしまいます。Python ならば、比較的複雑な作業を、数メガバイトのアプリケーションにすることが可能です。


具体的なアプリケーションの作業内容

わたしの作成したアプリケーションでは、次のようなことが可能です。

  1. 氏名やふりがな等が書かれている「氏名」シートと、種目や距離・タイムが書かれている「エントリー」シートを含むエクセルファイル20枚以上を読み込む

  2. 氏名は氏名でひとつにまとめ、エントリーはエントリーでひとつにまとめる

  3. 氏名のデータのうち、不具合のあるものについては、別のファイルに一覧と不具合の内容を保存し、それ以外については無駄な部分を削って整理する

  4. エントリーについては、生徒ひとりあたり、1種目または2種目のエントリーがあるので、そのことを配慮しながら、全体を整理する

  5. エントリーの内容について、すべての学校をひとつにまとめて、種目や距離等のエントリー数の一覧を作成する。この一覧を見ることによって、今回の大会で実施しない種目のエントリーの有無を確認する

  6. 各学校ごとに、男女別に種目と距離に関するエントリー数の一覧を作成する。大会の制限として、ひとつの学校のエントリー数に上限があるので、それをチェツクする

  7. 以上の作業について、まず、各学校から提出されたエクセルファイルを、ひとつのフォルダにまとめて置いておく。そこに、実行ファイルもコピーする。

  8. 6実行ファイルを動かすことによって、1番から6番までの作業を自動的に行う。結果として、全体をまとめたファイルと、不具合をまとめたテキストファイルを自動的に作成する

実際には、PEV01.exe が上のような機能を持つアプリケーションです。PEV01.exe から PEV08.exe までは、ひとつひとつの機能を確認するために作成しました。最後の PEV10.exe  は複雑なものになっていますが、ファイルの大きさは、あまり変わりません。

このように作業を行い、不具合については、それぞれの学校の担当者に電話等で確認することになります。そして、ファイルをもう一度提出してもらうか、当方で確認して手動で修正するなどします。

全体をまとめたファイルについては、専用の「プログラム作成アプリ」に読み込んで、きちんとした形のプログラムにしていきます。


なぜ「削除」することが重要なのか

今回、これらの作業を実施するアプリケーションを、6MB というファイルの大きさで作成することができました。実は、数年前にも、Python でアプリケーションを作成した経験があり、そのときは、「ちょっとアプリをつくったら、大きさが1GB を超えてしまった」という結果になりました。これでは、とても実用的な作業に使えないと考えて、諦めてしまった経験があります。

私自身は「なぜ、アプリケーションが巨大になってしまうのか」について、明確な理由を知りません。インターネット上の情報によると、「conda を用いて Pandas や Numby をつかうと、PyInstaller の仕様によって手当たり次第にアプリケーションに取り込んでしまうので、あっというまに 200MB 、 300MB 、ひどいときは 1GB のアプリケーションができあがる」とのことです。しかし私にとっては、「なるほど、そういうこともあるかも知れないなあ」としか言えません。

しかしながら、「あれも、これも、なんでも取り込んでいったら、たしかに、できあがったものが肥大化する可能性はありそうだなあ」とは思います。

そこで、まずは、すべてをキレイに削除し、すっからかんの状態にしてから、プログラムを作成してみました。その結果、上に書いたような機能をもつアプリケーションを、6MBという大きさで作ることができました。

そのノウハウを皆さんにも見ていただき、至らないところは修正していきたいなあと考えたのが、今回のブログの執筆動機です。


というわけで、削除の方法は次回

長くなってしまったので、具体的な「削除の方法は」、次回のブログで記載します


いいなと思ったら応援しよう!