Python

【Python】pyexcelで結合されたセルのデータを読み込む

pythonでexcelファイルやcsvファイルなどを扱う場合、pandasが便利だが、pandasはライブラリが大きく、整形されたテーブルデータを扱う前提となっている。

pyexcelはpandasと比べるとライブラリのサイズが非常に小さい。

また、excel帳票などの整形されていないデータでも、それなりに規則性を持って読み込みやすい。

また、pyexcelでは、用途に合わせてデータ読み込み方法を選択することができる。

本記事では、結合されたセルの内容がどのように読み込まれるのかを説明する。

読み込むexcelファイルについて

以下の内容のexcelファイルを読み込む。

横に結合されたセル、縦に結合されたセル、縦と横に結合されたセルがあるファイルを読み込む。

なお上記のファイルは、以下のように、結合されたセルに同じ値が入っているものとして読み込まれる。

セルが結合されていることに気づかないと、同じ値に対して何度も同じ処理をしてしまうことになるので注意。

辞書形式で行ごとに読み込み

引数で指定した行を辞書のキーとして、1行ずつデータを読み込む。

import pyexcel as pe

file_name = "./data/cell_merge_sample.xlsx"
# OrderdDictのリストとして取得
records = pe.get_records(file_name=file_name, )
print(f"{records}")
[OrderedDict([('colA', 1), ('colB', 11), ('colC', '縦結合'), ('colD', '縦横結合'), ('colE', '縦横結合')]),
 OrderedDict([('colA', '横結合'), ('colB', '横結合'), ('colC', '縦結合'), ('colD', '縦横結合'), ('colE', '縦横結合')]),
 OrderedDict([('colA', 3), ('colB', 33), ('colC', 333), ('colD', 3333), ('colE', 33333)])]

デフォルトでは1行目の値を辞書のキーとして、2行目以降のデータが1行ごとにリストとして読み込まれる。

辞書なので、キーを指定して値を取得可能。

for record in records:
    print(f"{record}")
    print(f"{record['colA']=}, {record['colB']=}")
OrderedDict([('colA', 1), ('colB', 11), ('colC', '縦結合'), ('colD', '縦横結合'), ('colE', '縦横結合')])
record['colA']=1, record['colB']=11
OrderedDict([('colA', '横結合'), ('colB', '横結合'), ('colC', '縦結合'), ('colD', '縦横結合'), ('colE', '縦横結合')])
record['colA']='横結合', record['colB']='横結合'
OrderedDict([('colA', 3), ('colB', 33), ('colC', 333), ('colD', 3333), ('colE', 33333)])
record['colA']=3, record['colB']=33

なお、引数name_columns_by_rowに数値を指定することで、キーとする行を指定できる。デフォルトでは0となっており、エクセルの先頭行(1行目)となっている。

records = pe.get_records(name_columns_by_row=1, file_name=file_name, )
print(f"{records}")

for record in records:
    print(record)
[OrderedDict([('1', 'colA'), ('11', 'colB'), ('縦結合', 'colC'), ('縦横結合', 'colD'), ('縦横結合-1', 'colE')]), 
OrderedDict([('1', '横結合'), ('11', '横結合'), ('縦結合', '縦結合'), ('縦横結合', '縦横結合'), ('縦横結合-1', '縦横結合')]), 
OrderedDict([('1', 3), ('11', 33), ('縦結合', 333), ('縦横結合', 3333), ('縦横結合-1', 33333)])]

OrderedDict([('1', 'colA'), ('11', 'colB'), ('縦結合', 'colC'), ('縦横結合', 'colD'), ('縦横結合-1', 'colE')])
OrderedDict([('1', '横結合'), ('11', '横結合'), ('縦結合', '縦結合'), ('縦横結合', '縦横結合'), ('縦横結合-1', '縦横結合')])
OrderedDict([('1', 3), ('11', 33), ('縦結合', 333), ('縦横結合', 3333), ('縦横結合-1', 33333)])

name_columns_by_rowに1を指定すると、エクセルの2行目(引数0が1行目に相当)をキーとして、キーの行以外の値が読み込まれる。

キーとして指定した行よりも上の行のデータも読み込まれる。

辞書形式で列ごとに読み込む

引数で指定した行を辞書のキーとして、1列ずつデータを読み込む。

dict_data = pe.get_dict(file_name=file_name)
pprint(dict_data)
OrderedDict([('colA', [1, '横結合', 3]),
             ('colB', [11, '横結合', 33]),
             ('colC', ['縦結合', '縦結合', 333]),
             ('colD', ['縦横結合', '縦横結合', 3333]),
             ('colE', ['縦横結合', '縦横結合', 33333])])

なお、引数name_columns_by_rowを指定することで、指定した行の値をキーとすることができる。(デフォルトでは0)

dict_data = pe.get_dict(file_name=file_name, name_columns_by_row=1)
pprint(dict_data)
OrderedDict([('1', ['colA', '横結合', 3]),
             ('11', ['colB', '横結合', 33]),
             ('縦結合', ['colC', '縦結合', 333]),
             ('縦横結合', ['colD', '縦横結合', 3333]),
             ('縦横結合-1', ['colE', '縦横結合', 33333])])

辞書形式での読み込みは、キーとする行がある場合に便利。

2次元リスト形式で読み込み

2次元のリスト形式での読み込みは、エクセルのデータ構造をそのまま表しているので、シンプルで分かりやすいかもしれない。

import pyexcel as pe
from pprint import pprint

array_data = pe.get_array(file_name=file_name)
pprint(array_data)
[['colA', 'colB', 'colC', 'colD', 'colE'],
 [1, 11, '縦結合', '縦横結合', '縦横結合'],
 ['横結合', '横結合', '縦結合', '縦横結合', '縦横結合'],
 [3, 33, 333, 3333, 33333]]

引数start_rowの値を指定することで、指定した行以降のデータを読み込むことができる。

デフォルトではstart_rowは0となっている。

array_data = pe.get_array(file_name=file_name, start_row=1)
pprint(array_data)
[[1, 11, '縦結合', '縦横結合', '縦横結合'],
 ['横結合', '横結合', '縦結合', '縦横結合', '縦横結合'],
 [3, 33, 333, 3333, 33333]]

2次元リストで読み込む場合、整形されていないデータを読み込むのに便利かもしれない。