pythonでExcel操作メモ

black laptop computer keyboard in closeup photo python

ただただメモしているだけです。たまったらまとめていきます

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)}')

結果、、びっくりするほど早かった。一瞬とは言わないまでも

設定するのとしないのでは天と地の差があった!

タイトルとURLをコピーしました