蛇使いな彼女BLOG
【第98回】Excelファイルからデータを抽出する
2024.02.02
皆様こんにちは。今回からお待ちかね!ハイライターを使ってコード解説をしていきたいと思います👏
第1回目は、Excelファイルの読み込みとセル値の抽出です。
モトハシあるあるなんですが、貯水池関係のデータの中にはまれに行政に手配して貰わないと手に入らないデータがあります。
例えば流入放流量や水位は国交省のデータベース上に掲載されているものもありますが、ダムによってはデータベースに公開されていないことも・・・!
そんな場合は行政から直接Excel形式のデータを貰うのですが、なぜかいつも手元に届くファイルのバージョンがExcel2003以前の古いものなんです(笑)。
そしてPythonではこの古いファイルはどうやっても開くことが出来ません。
そこでまず対象ファイルMicrosoft Excel 97-2003 ワークシート (.XLS)をMicrosoft Excel ワークシート (.xlsx)に変換して、Pythonで扱えるようにしてから、特定のセルの値を取得します。
openpyxlとpyexcelは事前にインストールしてください。
モトハシの場合確かpyexcelでファイルを読み込んだ際にエラーが発生しましたが、以下のプラグインをインストールしたら改善されました。
pip install pyexcel-xls pip install pyexcel-xlsx
変換前のExcelファイルはtestフォルダーにまとめている状態で、ざっと200個を超えています。(一部PDFファイルも含まれていたので、これはExcelに打ち直しました笑)
各Excelには、最初のシートのB11:B34に水位データが記されています。数式は埋め込まれていません。
import openpyxl import pyexcel import os import pandas as pd import glob #プラグインのインストール #pip install pyexcel-xls #pip install pyexcel-xlsx def convert_to_xlsx(xls, save_path): pyexcel.save_book_as(file_name=xls,dest_file_name=save_path) file_path=glob.glob('test/*.xls') for f in file_path: convert_to_xlsx(f,f[:-4]+'.xlsx') xlsx=glob.glob('test/*.xlsx') EL=[] for x in xlsx: wb = openpyxl.load_workbook(x, data_only=True) sheet = wb["管理日報"] for rows in sheet['B11':'B34']: for cell in rows: EL.append(cell.value) res=pd.DataFrame(EL)
簡単なので特に説明が必要な箇所はないのですが、強いて言うなら
wb = openpyxl.load_workbook(x, data_only=True)
data_only=Trueの場合、数式が埋め込まれている場合はその解を取得することができます。数式が無い場合でもセルの値を取得できます。
data_only=Falseの場合、数式そのものを取得します。
for rows in sheet['B11':'B34']: for cell in rows: EL.append(cell.value)
指定したシートと範囲の値はスクレイピングと同じく行構造になっているようなので、リストで受けた値をデータフレームで整えたら抽出完了です!
今日はここまで(^_^)/