Pythonで高度な処理をする場合、どうしてもfor文が絡んでくる…。
理解しようとしてるんだけど、全然わからない!
for文をわかりやすく教えて!
了解!
for文を身近な物に紐づけて解説するよ!
Pythonのfor文の基礎を
Python歴3年の私ができるだけわかりやすく解説し、解決に導きます。
Pythonのfor文の基礎
わかりやすさを重視しております。厳密には解釈が異なる場合がありますことをご了承ください。
for文とは
「for文」は「繰り返し」を行う処理のことです。
ざっくり日常生活で例えると、
- スマホカメラのシャッターボタンを連打する
- 誕生日に歳の数だけロウソクを立てる
- クッキーを無くなるまで食べる
といった感じでしょうか。
「もちつき」や「キャッチボール」など、何でもいいので繰り返すものを思い浮かべていただければ大丈夫です。
「繰り返し」は、
プログラミングの三大要素である「順次進行」「条件分岐」「繰り返し」の中の一つであり、
プログラミングを行う上では重要な部分であると言えます。
for文でできること
では、プログラミングのfor文ではどんなことができるのでしょうか。
前項の日常生活の例を元に、詳しく掘り下げていきましょう。
ただただ繰り返し
「for文とは」で例に挙げた「1.スマホカメラのシャッターボタンを連打する」は、
何も考えず「ただただ繰り返し」をしています。
しかしながら、ただただ繰り返しをしただけでは一生終わらず、いわゆる「無限ループ」になってしまいます。
なので、無限ループを回避するために「1分経ったら終了する」など終了する条件を指定しますが、openpyxlではあまり出てきませんので、詳細は割愛します。
指定の数だけ繰り返し
「2.誕生日に歳の数だけロウソクを立てる」は、指定の数だけ繰り返しを行っています。
「10まで」や「20まで」といった「ゴール」を最初に指定しておき、その数まで繰り返しを行うというものです。
こちらもopenpyxlで使わないことはないのですが、次項の方が出てくる頻度が高いため、次項を詳しく解説いたします。
なくなるまで繰り返し
「3.クッキーを無くなるまで食べる」は、○○が無くなるまで繰り返すというものになります。
○○というのは何が入るでしょうか。
Pythonでは「配列」である場合が多いです。
「取得」あるいは「作成」した配列が、「全て無くなるまでエクセルに記述する」という使い方をよくします。
配列がいまいち理解できてない場合は、わかりやすく解説した記事があります。
代表的な例は以下の通りです。
- A1からA3まで定型の文言を書き込む
- フォルダ内のファイル名(ファイルパス)をエクセルに羅列する
- 複数あるワークシートの内容を1つのワークシートにまとめる
上記の例は少し難しいため、まずはopnepyxlで使えるfor文の「基本の型」を見ていきましょう。
opnepyxlで使えるfor文の基本の型
for 変数名 in 配列名:
#ここに繰り返す処理内容を書く
上記がopnepyxlで使えるfor文の「基本の型」です。
1行目の文末に「:(コロン)」を忘れず書きましょう
(forの文末は必ず:です)
これだけではわかりにくいと思いますので、簡単な例を作ってみました。
hairetsu = ['A1', 'A2', 'A3']
for hensu in hairetsu:
print(hensu)
実行結果:
A1
A2
A3
下2行分が基本の型です。
「for hensu in hairetsu:」の部分は、「配列(hairetsu)の中から要素を1つ変数(hensu)に入れる」
という処理です。
処理の流れは以下の通りです。
- まず配列(hairetsu)の1番目の要素である「A1」が変数(hensu)に入る
- 次にhensuに入っている「A1」を「print」で表示
- 処理が最初に戻り、hairetsuの次の要素である「A2」がhensuに入り、表示される
- 同様にA3がhensuに入り、表示される
- 配列の要素が無くなったため、処理が終了する
配列の要素が無くなると、繰り返し処理が自動で終了します。
以上がopenpyxlで使えるfor文の基本の型と処理の流れです。
わかりやすく例えるなら、「わんこそば」でしょうか…。
大きなお盆に乗った「たくさんのわんこそば」が配列、「自分のお椀」が変数、「食べる作業」がprintです。
お盆に乗った「わんこそば達」(配列)を、お姉さんが「はい、じゃんじゃん」と言って、
次々と自分のお椀(変数)に入れてくれて、その都度食べる(printする)ようのものだと思ってください。
では次に実践例として、「配列の中身全てをエクセルに記述する」というfor文を作ってみましょう。
opnepyxlで使えるfor文の実践例1
簡単な「配列の中身全てエクセルに記述する」for文の例です。
簡単とはいえ、少し難しいです。できるだけわかりやすく解説しておりますので、
理解できなければ繰り返しご覧ください。
ひとまず全コードを網羅します。解説は後ほど行います。
全コード
import openpyxl
wb = openpyxl.load_workbook('forbun.xlsx')
ws = wb['Sheet1']
hairetsu = [['A1', 'B1', 'C1'],
['A2'],
['A3']]
for hensu in hairetsu:
ws.append(hensu)
wb.save('forbun.xlsx')
hairetsu = [['A1', 'B1', 'C1'],
['A2'],
['A3']]
for hensu in hairetsu:
ws.append(hensu)
実行見本
A1セルに「A1」・・・C1セルに「C1」・・・A3セルに「A3」を書き込んで終了となる処理です。
解説
インポート、ワークブック・シートの取得
openpyxlのインポートなど、openpyxlの基本解説は長くなるため今回は割愛させていただきます。
下記記事で解説しておりますのでご参考ください。
配列の作成
まずは配列の作成のしかたについてです。
「配列を作成するだけではなく、取得する方法も教えて!」と思うかもしれませんが、取得にもfor文を使用するため、まずはココで基礎を勉強しましょう。
hairetsu = [['A1', 'B1', 'C1'],
['A2'],
['A3']]
少し難しいですが、二次元配列になっています。
二次元配列とは、ざっくり説明すると「XとY」「横と縦」など、方向が2つある配列です。
普通の配列は横や縦のどちらか一方のみですが、二次元配列は「横と縦」があります。
エクセルファイルも横(列)と縦(行)があるため、ぴったりですね!
もう少しわかりやすくするために、見本の二次元配列を1行目だけにしてみましょう。
hairetsu = [['A1', 'B1', 'C1']]
これで、「A1セルに A1 」「B1セルに B1 」「C1セルに C1 」
とだけ書き込むコードが出来上がりました。
[]が二重になっているのは、二次元配列だからです。
赤い[]内は横に移動、青い[]内は縦に移動します。
赤[]内の要素は3つ、青[]内の要素は1つなので(赤[]を1つの要素として見る)
横3列、縦は1行の書き込みになります。
今度は、A1、A2、A3にだけ書き込むコードにしてみましょう。
hairetsu = [['A1'], ['A2'], ['A3']]
さきほどとの違いは、「A1」「A2」「A3」がそれぞれ[]でくくられています。
何度も言いますが、赤い[]内は横に移動、青い[]内は縦に移動します。
赤[]内の要素は1つずつ、青[]内の要素は3つなので(赤[]を1つの要素として見る)
横1列、縦は3行の書き込みになります。
では、この2つを合体してみましょう。
hairetsu = [['A1', 'B1', 'C1'], ['A2'], ['A3']]
改行を加えて表示方法を変えてみます。
hairetsu = [['A1', 'B1', 'C1'],
['A2'],
['A3']]
そうです!最初の見本と同じになりました。
しつこいようですが、赤い[]内は横に移動、青い[]内は縦に移動します。
まずはA1、次に横に移動してB1、次はC1
赤[]が終わったので次は縦に移動して、A2
また赤[]が終わったので縦移動してA3を書き込んで終了となります。
for文
大まかな処理の流れは前項で解説いたしましたので割愛しますが、
初めて出てきたものを解説します。
ws.append(hensu)
上記コードは変数(hensu)をワークシート(ws)に書き込むという処理です。
前項の「print」は画面に表示。こちらの「append」はwsに追加(記述)と覚えてください。
自動でA1から始まり、hensuに入れるhairetsuの要素が無くなるまで繰り返します。
以上で「基本の型」と「実践例」を解説いたしました。
これらを応用すれば、さまざまな処理に役立てることができます。
opnepyxlで使えるfor文の実践例2
次に、全体の文字を斜体にする例を見ていきましょう。
全コード
import openpyxl
from openpyxl.styles.fonts import Font
wb = openpyxl.load_workbook('input.xlsx')
ws = wb['Sheet1']
syatai = Font(italic = True)
for row in ws:
for cell in row:
ws[cell.coordinate].font = syatai
wb.save('input.xlsx')
syatai = Font(italic = True)
for row in ws:
for cell in row:
ws[cell.coordinate].font = syatai
実行見本
解説
まずインポートと斜体に関する解説です。
今回の本題はfor文のため、このあたりの解説はさらっと流します。
インポート、文字を斜体にする
>>import openpyxl
>>from openpyxl.styles.fonts import Font
文字を斜体にするには、上記インポートが必要です。
>>syatai = Font(italic = True)
上記1文で、セル内の文字を斜体にすることができます。
for文
ここからが本題です。
for row in ws:
for cell in row:
ws[cell.coordinate].font = syatai
上記を記述することで、 表全体の文字を斜体することができます。
2重ループになっているので少し難しいですが、1つずつ解説いたします。
後半でわかりやすい解説を用意しています。
まずワークシートに何らかの処理をする場合、
「A1~E5まで」という行と列が絡んだ範囲を一度に処理することはできません。
ではどのように処理しているのでしょうか。
「for row in ws:」
ws(ワークシート)をrow(行)という変数に入れていきます。
wsは二次元配列のため、rowは単なる配列になります。
「for cell in row:」
今度はrowをcell(セル)という変数に入れていきます。
rowは配列のため、cellは配列ではなく、ただの変数になります。
あとはセル1つ1つに斜体(syatai)を適用していきます。
「coordinate」で座標を取得し、1行目を1セルずつ処理しているという感じです。
でもこれではわかりにくいと思いますので、例え解説をどうぞ。
もっとわかりやすい解説
今回は分かりやすく県・市・区に例えて解説いたします。
wsは県(県知事)、row(行)は市(市長)、セルは区(区長)だと思ってください。
このたび、県全体で道路整備(斜体設定)をしないといけないことになりました。
県全体(ws全体)が一度に処理できないことに困った県の知事(ws)は、
まず市ごと(1行ごと)に道路整備することを試みます。
知事は、一市の市長(1行目)~五市の市長(5行目)を呼び出し、
それぞれ「自分の市の道路整備をしなさい」と指示を出します。
(ここまでが「for row in ws:」)
※この時点では、まだ各セル(区)の処理はできていません。
知事(ws)の指示を受けた各市長(row)は、
自分の市内の区ごと(セルごと)に道路整備することを試みます。
一市A区(A1セル)~一市E区(E1セル)の区長を呼び出し、
それぞれ「自分の区の道路整備をしなさい」と指示を出します。
(ここまでが「for cell in row:」)
市長の指示を受けた各区の区長(cell)は、
自分の区を道路整備します。
「coordinate」で自分の区の範囲(座標)を確認し、道路整備を終えます。
(ここまでが「ws[cell.coordinate].font = syatai」)
いかがでしたでしょうか。
こんな感じのことを繰り返しています。
最後に
openpyxlで使えるfor文の基礎を解説いたしました。
for文を使用すれば、openpyxlでできることの幅が広がります。
ぜひ活用してみてください。
最後までお読みいただき、ありがとうございました。がんばってください!