会社の先輩や別の人が書いたコードを見ると、
「iter_rows()」っていうのがよく出てくるんだけど、これって何なの?
なるほど…。「iter_rows」について知りたいんですね?
では今回は、「iter_rowsの機能や使い方」について、
できるだけわかりやすく解説いたします!
実践用の使用方法も紹介しますよ!
「iter_rows()」は何ができる?
「iter_rows()」はセルの値を取得することができます。
openpyxlでエクセルを編集する際に使うと非常に便利です。覚えておきましょう!
まずは下図を見てください。
エクセルのA1~E5セルにそれぞれ値が入っています。
「iter_rows()」を使うことで、これらの値を全て取得することができます。
取得した値は、別のシートにコピーしたり、特定の値(たとえば0以下)なら文字色を変えたりすることもできます。
しかしながら、「iter_rows()」を使わなくても、各セルの値を取得する方法はあります。
「iter_rows()」を使うメリットを解説したいところですが、使い方がわかっていないと理解するのが難しいかと思いますので、先に使い方を見ていきましょう。
記事前半では「説明用の簡単な使い方」と、「実践用の使い方」の2種類を紹介いたします。
「iter_rows()」を使うメリットは、記事後半の【「iter_rows()」の特徴】の項をご覧ください。
事前準備
- openpyxlのインストール
既存のエクセルファイルを編集するには「openpyxl」のインストールが必要です。
openpyxlのインストール方法
openpyxlを初めて使用する場合は、下記コードを入力・実行して、インストールしてください。
pip install openpyxl
※openpyxlを使用したことがある場合は、このインストール作業は不要です。
openpyxlの基礎解説
既存ファイルを開いて保存する方法などの操作の基本解説は、下記記事で行っております。
ご参考ください。
「iter_rows()」の使い方(説明用簡易版)
ひとまず全コードを網羅します。解説は後ほど行います。
全コード・実行見本
▼「input.xlsx」
import openpyxl
wb = openpyxl.load_workbook('input.xlsx')
ws1 = wb['Sheet1']
for row in ws1.iter_rows(values_only = True):
for cell in row:
print(cell)
wb.save('input.xlsx')
実行結果:A1 B1 C1 D1 E1 A2 B2 ・・・D5 E5
for文についての解説は、下記記事でわかりやすく行っております。ご参考ください。
解説
for row in ws1.iter_rows(values_only = True):
for cell in row:
print(cell)
「iter_rows()」含め上記3行分を記述することで、
Sheet1に書かれた表の値を取得することができます。
取得順は、実行結果のとおりで、「A1」の次は「B1」と横に走ります。
「E1」まで来たら次は「A2」という具合に「E5」まで取得します。
for row in ws1.iter_rows(values_only = True):
()内の引数「values_only = True」ですが、
これは「セルの値のみを返す」というもので、「返り値に関する引数」です。
何を言っているのかわからないです…。
「values_only = True」は解説用に付けただけです。
これを付けないと実行結果が
<Cell ‘Sheet1’.A1> <Cell ‘Sheet1’.B1> <Cell ‘Sheet1’.C1>
と長くなってわかりにいので付けました。
「セルの値のみを取得した」と思っていただいても問題ありません。
()内に入れる引数について「範囲指定」
「values_only」も含めて5種類あります。
主に、範囲指定で取得したい場合に使います。
- min_row:範囲指定する際の始点行番号(C2なら2)
- min_col:範囲指定する際の始点列番号(C2なら3)
- max_row:範囲指定する際の終点行番号(E4なら4)
- max_col:範囲指定する際の終点行番号(E4なら5)
- values_only:Trueにすると、セルの値のみを返す
上の画像のように「C2~E4」の範囲までを取得する、簡単な見本を見てみましょう。
import openpyxl
wb = openpyxl.load_workbook('input.xlsx')
ws1 = wb['Sheet1']
for row in ws1.iter_rows(min_row=2,min_col=3,max_row=4,max_col=5,values_only=True):
for cell in row:
print(cell)
wb.save('input.xlsx')
【範囲:C2~E4】
min_row=2
min_col=3
max_row=4
max_col=5
実行結果:C2 D2 E2 C3 D3 E3 C4 D4 E4
指定通り、C2~E4までが取得できています。
「iter_rows()」の使い方(実践例)
「Sheet1」に書かれた表を取得して、「Sheet2」にコピーするサンプルコードを見てみましょう。
実行見本・全コード
import openpyxl
wb = openpyxl.load_workbook('input.xlsx')
ws1 = wb['Sheet1']
ws2 = wb['Sheet2']
for row in ws1.iter_rows():
new_row = [cell.value for cell in row]
ws2.append(new_row)
wb.save('input.xlsx')
解説
for row in ws1.iter_rows():
new_row = [cell.value for cell in row]
ws2.append(new_row)
7行目、それから8行目の「for cell in row」は前項で出てきましたね。
セルの値を取得するという意味でした。
8行目の「cell.value」は、「取得したセルの値をどうするか」という意味だと思ってください。
「new_row =」が付いているため、「取得した値を変数(new_row)に入れる」
ということになります。
9行目の「ws2.append(new_row)」は、
「取得した値(new_row)をSheet2(ws2)に追加していく」
という結果になり、最終的にはSheet2に値をコピーすることができるわけです。
「append」は、配列に要素を追加するという効果があります。
詳しくは下記記事をご参考ください。
「iter_rows()」の特徴
「iter_rows()」の代表的な特徴は下記の3つです。
- 取得範囲が設定しやすい
- メモリ使用量が少ない
- コードがわかりやすい
1つ1つ解説していきます。
取得範囲が設定しやすい
【「iter_rows()」の使い方(説明用簡易版)】の項で、iter_rows()の引数について解説いたしました。
その中に始点や終点などを指定するものがありました。
この引数を使えば、取得範囲を1セル単位で自由に設定できます。
しかも数字を変えるだけですので、比較的簡単に範囲を設定・変更することができます。
表全体ではなく、「B2~D8」など少しズレて取得したい場合は非常に便利です。
メモリ使用量が少ない
取得範囲と同様、引数の中に「values_only」がありました。
これは「値のみを返す」という設定にできる引数です。
通常であれば、「<Cell ‘Sheet1’.A1>」などセルの情報を一緒に返してしまいます。
ところが「values_only = True」にすることによって、値(A1)のみを返すことができます。
つまりその分メモリを占領せずにプログラミングを実行することができるわけです。
コードがわかりやすい
【「iter_rows()」は何ができる?】の項で、「iter_rows()」は値を取得できるとお伝えしました。
つまり、コード内に「iter_rows()」が出てきたら、「値を取得している」ということになるわけです。
このわかりやすさが地味に大切で、1つのプログラムを複数人で編集する際は、読み解く時間の短縮にもつながります。
うまく動作しない時の原因と対処法
エラーが出る
No such file or directory: ○○
これは、読み込むファイルやフォルダが見つからないというエラーです。
読み込むファイルのファイル名と構文のファイル名が一致しているか確認しましょう。
詳しい解説は、下記記事をご参考ください。
Permission denied: ○○
操作しようとしているファイルにアクセスできないというエラーです。
「ファイルを開いている状態なので編集できない」と言っていることが多いので、開いていれば閉じて再度トライしましょう。
詳しい解説は、下記記事をご参考ください。
Worksheet ○○ does not exist
「指定したシートがありません」というエラーです。
指定のシート名が間違っていないか、「sheet1」など先頭が小文字になっていないか確認しましょう。
詳しい解説は、下記記事をご参考ください。
○○ is not defined
今まで出てきていない変数などを処理しようとした時に出るエラーです。
変数名などが間違っていないかチェックしましょう。
詳しい解説は、下記記事をご参考ください。
その他のエラー
その他のエラーが出た場合は、エラー文をコピーしてNETで検索してみましょう。
最後に
openpyxlでの「iter_rows()」の使い方を解説いたしました。
複数のシートにあるデータをまとめたりするのに便利ですので、ぜひご活用ください。
当ブログでは、Pythonに関する情報を配信しております。
この記事がわかりやすいと感じた方は、他の記事も読んでいってください。
最後までお読みいただき、ありがとうございました。がんばってください!