@you-pong

Are you sure you want to delete the question?

If your question is resolved, you may close it.

Leaving a resolved question undeleted may help others!

We hope you find it useful!

【Python】openpyxlでmax_rowやmax_columnに+1する理由

openpyxlでmax_rowやmax_columnに+1する理由が理解できません

openpyxlでExcelの行/列から値を取得する際に、
以下のようなサンプルコードで行の最大値を+1する理由がわからず
ご教示頂けますと幸いです。

Excelでは1行目を1、・・・、n行目をnと解釈し、
Pythonでは1行目を0、・・・、n行目をn-1と解釈する、
ということは理解しました。

サンプルコード

min_row = sheet.min_row
max_row = sheet.max_row
for row_no in range(min_row, max_row+1):
        print(sheet.cell(row_no, 1).value)

max_row+1しないと欲しい出力結果が得られないことはわかったのですが、
そうであれば、min_rowも+1しないとfor文で回す回数が1つ増えませんか?

上記サンプルコードの記述ではsheetの定義を省略していますが、
A1セル~A100セルまでデータが入ったシートです。

上記サンプルコードを実行すると、欲しい情報が100行で出力されました。
+1をなくすと、99行目までしか出力されませんでした。

試しに

print(min_row)
print(max_row)

を実行すると

1
100

と出力されたので、やはりなぜ+1するのかわからなくなってしまいました。

0 likes

2Answer

Pythonでは1行目を0、・・・、n行目をn-1と解釈する、
ということは理解しました。

この先入観が理解を妨げているのでしょうが,多くのExcelライブラリでは行番号と列番号は1からカウントします.1
Excelデータを扱うにあたっては,原則1からカウントするものと注意して実装してください.

range関数が終端を含まない理由は下記の事情があります.

生憎他言語にある3式タイプのfor文がPythonでは使えないので,細かいデバッグが必要ならwhileの代用を検討してください.

  1. 他言語に存在するライブラリでも大体そうなので,恨むならOpenXML規格を恨んでください.

2Like

Comments

  1. @you-pong

    Questioner

    回答有り難うございました。
    range関数側の仕様だったのですね。

パイソン君は友達以上、恋人未満の関係?
エクセル君は友達以上、恋人以下の関係?
でも、つき合った長さは同じです。

min_row = sheet.min_row - 1  # 0
max_row = sheet.max_row      # 100
for row_no in range(min_row, max_row):
    print(sheet.cell(row_no + 1, 1).value
比較コード
For row_no = min_row + 1 To max_row
     ……
Next row_no

python は 何故か 0から100の手前の範囲指定が文法です。何故かは私には説明できません。 range(max_row)でもok

pythonの文字列の範囲指定を思い出してください。
0       6
| P | y | t | h | o | n |
        -1
苦しい説明がありました。

恋はゼロから始めるか?それとも、恋は1歩から踏み出すのか?どちらでしょうか?

1Like

Comments

  1. @you-pong

    Questioner

    回答ありがとうございます。
    恋人に例えていただいて「恋愛もわからないけどそういうもんだ」
    ということで理解できました。

Your answer might help someone💌