ただただメモしているだけです。たまったらまとめていきます
python×EXCEL
excel数ファイルを読み込む
とある案件でExcel数十ファイルを処理しなくてはならないことがあったのでメモ
Excel毎にたくさんシートがあったのでとりあえずシート数がいくつか知りたいと思い
openpyxlでシートを取得することに
import openpyxl
from pathlib import Path
p = Path(filepath) # excelシート群が格納されているパス
files = list(p.glob('*.xlsx'))
file_name = []
for file in files:
wb = openpyxl.load_workbook(file)
for sname in wb.sheetnames:
file_name.append(sname)
print(f'シート数:{len(file_name)}')
これでおしまいのはずだったのだが、EXCELファイルが約8MBで
自分のPCのスペックが今時びっくりするほど低い。ゆえに全然ロードされず。。
やむを得ず、速度に定評があるpandasを試す
import pandas as pd
df = pd.read_excel(file)
割と早い!しかしread_excelは先頭のシートしか読み込んでくれない。。
そもそもシート名がわからないからロードしているということを忘れていたアホ
ググってみるとシート名をNoneにすると全シート読み込んでくれる模様
df = pd.read_excel(file, sheet_name=None)
そしてdfにはキーバリューで格納されていることに気づく。つまり
keys = list(df.keys())
len( keys )
これでシート数もシート名たちも分かった
しかし全シートから特定のデータを最終的に抽出したいんだが。。
DataFrameでパズルを解くか?悪くないけどめんどくさい
なんかいいものがないかopenpyxlのドキュメントを読んでも、いい感じの引数がない
ダメもとでread_onlyを設定してみた。感覚的にちょっとくらいは早くなりそうだから。
import openpyxl
from pathlib import Path
p = Path(filepath) # excelシート群が格納されているパス
files = list(p.glob('*.xlsx'))
file_name = []
for file in files:
wb = openpyxl.load_workbook(file, data_only=True, read_only=True)
for sname in wb.sheetnames:
file_name.append(sname)
print(f'シート数:{len(file_name)}')
結果、、びっくりするほど早かった。一瞬とは言わないまでも
設定するのとしないのでは天と地の差があった!