LoginSignup
0
0

More than 3 years have passed since last update.

社内勉強会 機械学習入門(5.続Pythonでプログラムを書いてみよう)

Last updated at Posted at 2019-08-23

今日も、Pythonを使ってプログラムを書いてみたいと思います。

題材

PythonでExcelファイルを操作するプログラムです。
Excelファイルを読み、シート上のセル値を標準出力してみます。

以下のようなExcelファイルを「sample.xlsx」というファイル名で準備してください。
ファイルは、「C:\ml-intro」の下に置く前提で進めます。
2019-08-23_15h11_08.png

※openpyxlという、PythonでExcelファイルを操作するためのライブラリを使います。

コードを書いてみよう

Python仮想環境を有効化し、「jupyter notebook」を起動しましょう。
以下のコマンドを実行
$ cd C:\ml-intro
$ env\Scripts\activate.bat
$ jupyter notebook

notebookを開いて、ライブラリをインストールしましょう。
!pip install openpyxl

まずは、ファイルを読み、A1セルの値を標準出力してみましょう。

import openpyxl as px

wb = px.load_workbook('./sample.xlsx') # ワークブック読み込み
ws = wb.active                         # ワークシート取得
a1 = ws['A1'].value                    # A1セルの値を取得
print(a1)

実行結果は、こんな感じです。(A1セルの値がちゃんと出力されました。)
2019-08-23_15h20_01.png

ワークシートを指定したり、R1C1形式でセルの値を取得することもできます。

import openpyxl as px

wb = px.load_workbook('./sample.xlsx') # ワークブック読み込み
# ws = wb.active
ws = wb['Sheet1']                      # シート名を指定
# a1 = ws['A1'].value
r1c1 = ws.cell(row=2, column=1).value  # 2行目、1列目のセルの値を取得
print(r1c1)

次は、シート上の「セルの値」をすべて標準出力してみよう。

for row in ws.rows:
    print('----------------------------')
    for c in row:
        print(c.value)

ws.rowsは、シート上で"何らかの値や書式設定がされているセル範囲"にある「rowオブジェクト」の集まりです。
サンプルのExcelファイルの場合ですと、4行分のrowオブジェクトが集まったものです。
そのrowオブジェクトの集まりから1つずつfor構文で1行分のrowオブジェクトを取り出しています。
更に、rowは、セルの集まりなので、rowから1つずつcellオブジェクトを取り出して、その値を標準出力しています。

実行結果は、こんな感じです。
2019-08-23_15h29_19.png

プログラムを改良してみよう

出力結果がイマイチなので、こんな感じ(↓)の標準出力に改修してみましょう。
2019-08-23_15h46_09.png

import openpyxl as px

wb = px.load_workbook('./sample.xlsx')
ws = wb['Sheet1']
for row in ws.rows:
    row_str = ''
    for cell in row:
        row_str =  row_str + str(cell.value) + '|'
    row_str = row_str[:-1]   # 一番後ろに付いてしまう(|)は削除する
    print(row_str)

実行結果は、こんな感じです。
2019-08-23_15h49_53.png

更に、joinメソッドを使って少しコードをスッキリさせてみよう。
joinメソッドは、「組み込み型の1つである str のメソッド」という扱いらしいです。

[参考情報]
https://python.ms/sub/misc/join/#join-%E3%81%AE%E8%A9%95%E5%88%A4
https://www.lifewithpython.com/2017/07/why-python-join-is-string-method.html

import openpyxl as px

wb = px.load_workbook('./sample.xlsx')
ws = wb['Sheet1']
for row in ws.rows:
    current_row = []   # 空のリストを準備
    for cell in row:
        current_row.append(str(cell.value)) # リストにセルの値を追加する
    print('|'.join(current_row))            # joinメソッドの引数にリストを渡すと指定文字で連結してくれる

実行結果は、こんな感じです。
2019-08-23_15h49_53.png

関数を定義してみよう

joinメソッドを使わず、「myjoin」という関数を自作してみよう。

import openpyxl as px

'''
  myjoin関数の定義
    引数:rowオブジェクト
    戻り値:rowに含まれるセルの値をパイプ文字(|)で結合した文字列
'''
def myjoin(row):
    row_str = ''
    for cell in row:
        row_str =  row_str + str(cell.value) + '|'
    return row_str[:-1]

wb = px.load_workbook('./sample.xlsx')
ws = wb['Sheet1']
for row in ws.rows:
    print(myjoin(row))  # myjoin関数を使用

実行結果は、こんな感じです。
2019-08-23_16h19_04.png

まとめ

今日は、「繰り返し」や「関数の定義」をポイントにプログラムを書いてみました。
次回は、ようやく機械学習らしいプログラムを書いてみたいと思います。

次回は、「6.手書きの数字を判定してみよう」です。
社内勉強会 機械学習入門(6.手書きの数字を判定してみよう)

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0