送られてきたエクセルファイルなんだけど、空白のセルがある…。
空白セルは後々誤作動につながるから行ごと削除したい。
openpyxlで空白行を削除できるの?
できますよ!
では今回は、「openpyxlで空白行を削除する方法」を
できるだけわかりやすく解説いたします!
openpyxlで空白行を削除する方法(全ての列に空白がある行を削除)
「delete_rows」を使います。
まずは「全ての列が空白の場合、その行を削除」する方法を紹介いたします。
ひとまず全コードと実行結果をお見せします。
解説は後ほど行います。
全コード
import openpyxl
wb = openpyxl.load_workbook('C://Utatane/input.xlsx')
ws = wb['Sheet1']
rows_to_delete = []
for row in ws.iter_rows():
if all(cell.value is None for cell in row):
rows_to_delete.append(row[0].row)
for row_num in reversed(rows_to_delete):
ws.delete_rows(row_num)
wb.save('C://Utatane/output.xlsx')
rows_to_delete = []
for row in ws.iter_rows():
if all(cell.value is None for cell in row):
rows_to_delete.append(row[0].row)
for row_num in reversed(rows_to_delete):
ws.delete_rows(row_num)
実行結果
事前準備
- openpyxlのインストール
既存のエクセルファイルを編集するには「openpyxl」のインストールが必要です。
openpyxlのインストール方法
openpyxlを初めて使用する場合は、下記コードを入力・実行して、インストールしてください。
pip install openpyxl
※openpyxlを使用したことがある場合は、このインストール作業は不要です。
インストールに関する詳細や、インストールができなかった場合の対処法は下記記事で解説しております。
また、既存ファイルを開いて保存する方法など、基本解説も行っておりますのでご参考ください。
解説
※わかりやすさを重視しております。厳密には解釈が異なる場合がありますことをご了承ください。
rows_to_delete = []
for row in ws.iter_rows():
if all(cell.value is None for cell in row):
rows_to_delete.append(row[0].row)
for row_num in reversed(rows_to_delete):
ws.delete_rows(row_num)
上記コードにて、すべての列に空白がある行を削除することができます。
1つ1つ解説していきます。
配列を用意
rows_to_delete = []
コードの6行目にて、削除する行番号を一時保存するための配列を用意しています。
配列については下記記事をご参考ください。
空白行を取得
for row in ws.iter_rows():
if all(cell.value is None for cell in row):
rows_to_delete.append(row[0].row)
コードの8行目~10行目で、すべての列が空白である行を取得しています。
【コード8行目】
「iter_rows」でシート内の値を取得し、1行分を配列(row)に格納しています。
(for文で2行目、3行目と最終行まで繰り返し)
for文やiter_rowsについては下記記事をご参考ください。
【コード9行目】
if文を使って、「1行(row)の中で、すべて(all)の列に空白(None)があれば」という条件式を指定しています。
if文については、下記記事をご参考ください。
【コード10行目】
9行目の条件式にあてはまる行があれば、配列「rows_to_delete」に行番号を追加していきます。
今回の場合は3行目が条件にあてはまるため、「3」が配列に格納されます。
シート内の値が存在する行が無くなれば、for文が自動的に終了します。
空白行を削除
for row_num in reversed(rows_to_delete):
ws.delete_rows(row_num)
上記コードにて、空白行を削除しています。
削除するのは、コードの10行目で取得した行(rows_to_delete)です。
for文で行を削除していくわけですが、上から削除してしまうと、削除した次の行が上へとズレていくため、指定ではない行が削除されてしまう場合があります。
そこで、「reversed」を使い、「行を下から削除」しています。
これで、すべての列が空白の行を削除することができます。
しかしながら、いずれかの列に空白がある場合(空白が1つでもあれば)、その行を削除したい時もあるかと思います。
その方法は次項で解説いたします。
openpyxlで空白行を削除する方法(いずれかの列に空白がある行を削除)
前項では、すべての列が空白の場合にその行を削除する方法を解説いたしました。
今回はいずれかの列に空白がある場合にその行を削除する方法です。
早速コードを見てみましょう。
import openpyxl
wb = openpyxl.load_workbook('C://Utatane/input.xlsx')
ws = wb['Sheet1']
rows_to_delete = []
for row in ws.iter_rows():
if any(cell.value is None for cell in row):
rows_to_delete.append(row[0].row)
for row_num in reversed(rows_to_delete):
ws.delete_rows(row_num)
wb.save('C://Utatane/output.xlsx')
前項のコードと比べて、9行目の「if all」が「if any」に変わっただけです。
anyなので、いずれかの列に空白がある場合、「rows_to_delete」に行番号が格納されていき、最終的にその行が削除されます。
最後に、特定の列が空白だった場合にその行を削除する方法です。
次項で解説いたします。
openpyxlで空白行を削除する方法(特定の列に空白がある行を削除)
下記コードにて、特定の列(今回はA列)が空白だった場合に、その行を削除することができます。
import openpyxl
wb = openpyxl.load_workbook('C://Utatane/input.xlsx')
ws = wb['Sheet1']
rows_to_delete = []
for row in ws.iter_rows:
if row[0].value is None:
rows_to_delete.append(row[0].row)
for row_num in reversed(rows_to_delete):
ws.delete_rows(row_num)
wb.save('C://Utatane/output.xlsx')
これまで紹介した2種類の方法と比べて、9行目が違います。
「row[0]」は、1行の中での0番目なので「A列」を指します。
つまり、A列がNone(空白)だった場合に・・・という条件式になるわけです。
空白を探す対象をB列にしたい場合は、[1]、C列なら[2]という具合に変更してください。
今回は「openpyxl」で空白行を削除しましたが、「pandas」というライブラリの「dataframe」を使えばもっと簡単に行えます。
書式を保存できないというデメリットはありますが、目的に応じて使い分けてみてください。
うまく動作しない場合の対処法
エラーが出る
No such file or directory: ○○
これは、読み込むファイルやフォルダが見つからないというエラーです。
読み込むファイルのファイル名と構文のファイル名が一致しているか確認しましょう。
詳しい解説は、下記記事をご参考ください。
Permission denied: ○○
操作しようとしているファイルにアクセスできないというエラーです。
「ファイルを開いている状態なので編集できない」と言っていることが多いので、開いていれば閉じて再度トライしましょう。
詳しい解説は、下記記事をご参考ください。
Worksheet ○○ does not exist
「指定したシートがありません」というエラーです。
指定のシート名が間違っていないか、「sheet1」など先頭が小文字になっていないか確認しましょう。
詳しい解説は、下記記事をご参考ください。
○○ is not defined
今まで出てきていない変数などを処理しようとした時に出るエラーです。
変数名などが間違っていないかチェックしましょう。
詳しい解説は、下記記事をご参考ください。
その他のエラー
その他のエラーが出た場合は、エラー文をコピーしてNETで検索してみましょう。
最後に
openpyxlで空白行を削除する方法を解説いたしました。
当ブログでは、Pythonに関する情報を配信しております。
この記事がわかりやすいと感じた方は、他の記事も読んでいってください。
挫折せずにPythonを独学で学習する方法は特におすすめです。
最後までお読みいただき、ありがとうございました。がんばってください!