PythonでExcel操作:条件に合致するデータを抽出する(抽出リストでのアプローチ)

勉強系(Python/Excel/統計学/その他)

全体まとめページは↓より。

やりたいこと

指定した列に対して、条件に合致するデータを抽出してその行のみ転記する。

「名前」が”山本”,”高橋”,”小林”のデータだけ転記したい。

フォルダ構成

VSCodeで実行するときはprg配下を開いてpyファイルを作り実行する。

実装

★部分が今回のポイント。
抽出したい値を格納したリストをext_listとして定義し、辞書リストの1行ずつとext_listの項目をforで突合していく。

import os
import openpyxl
from operator import itemgetter

#辞書リストの作成関数
def make_shipment(sh):
    shipment_list = []
    for row in sh.iter_rows():
        if row[0].row == 1:
            header_cells = row
        else:
            row_dic = {}
            for v, k in zip(header_cells, row):
                row_dic[v.value] = k.value
            shipment_list.append(row_dic)
    return shipment_list

#項目リスト
collist = ["index","名前","出身地"]

#ファイル名を入力させる
print("ファイル名を入力:")
filename = input()

#読み込みファイルパスを作成
infile_path = os.path.join("..\indata" , filename)

#出力ファイルパスを作成
outfile_path = os.path.join("..\outdata" , filename)

#読み込みファイルからオブジェクトを生成
iwb = openpyxl.load_workbook(infile_path)
ish = iwb.active

#出力ファイルのオブジェクトを生成
owb = openpyxl.Workbook()
osh = owb.active

#辞書リストを作成
shipment_list = make_shipment(ish)

#★転記対象を管理するフラグリストを定義
#ヘッダ行ははじめから転記対象:1を設定
flg_list = []
for n in range(len(shipment_list)):
    flg_list.append(0)
#flg_list[0] = 1

#★抽出リストを作成
#「名前」項目がこれらの値に合致すれば転記対象列にする
ext_list = ["小林","山本","高橋"]

#★辞書リストと抽出リストの突合
#1行ごとに、「名前」が抽出リストの要素と一致するか突合する
ext_key = ""
flg = 0
for dic in shipment_list:
    ext_key = dic["名前"]
    for n in range(len(ext_list)):
        if ext_key == ext_list[n]:
            flg_list[flg] = 1
    flg += 1

#転記先ヘッダ処理
for col in range(len(collist)):
    osh.cell(1,col+1).value = collist[col]

#転記先ヘッダ処理
for col in range(len(collist)):
    osh.cell(1,col+1).value = collist[col]

#★転記処理
#転記flg==1ならその行を転記する。
flg= 0
list_row = 1
for dic in shipment_list:
    if flg_list[flg] == 1:
        list_row += 1
        for col in range(len(collist)):
            colname = collist[col]
            osh.cell(list_row,col+1).value = dic[colname]
            col += 1
    flg += 1

#出力ファイルを保存
owb.save(outfile_path)

出力結果

同じ抽出条件でexcelのフィルターをかけた状態と同じ抽出結果になっている。

以上

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