質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

2回答

6717閲覧

Pythonで2つのExcelファイルを比較し,一致するセルを抽出したい

DangerousKT

総合スコア1

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2020/09/20 16:05

編集2020/09/21 13:05

Pythonで2つのExcelファイルを比較し,一致するセルを抽出したいです。

具体的には、以下の2つのファイルを比較し、一致しているIPを抽出したいです。

  1. file1のB列2行目~10行目にIPアドレスが記載されています。

(IPアドレスの記載は都度々々変わります。)
2. File2のB列2行目~10行目にもIPアドレスが記載されています。
(IPアドレス台帳で記載内容は基本変わりません。)
また、C列目にそのIPアドレスの利用用途(Aネットワーク用等)が説明書きされています。

有識者の協力もありつつ以下ソースコードまでは作成しました。

pip install openpyxl import openpyxl wb1 = openpyxl.load_workbook('c:/py/file1.xlsx') wb1_sheet1 = wb1['Sheet1'] wb1_sheet1_arealist = ['B2','B3','B4','B5','B6','B7','B8','B9','B10'] wb2 = openpyxl.load_workbook('c:/py/file2.xlsx') wb2_sheet1 = wb2['Sheet1'] wb2_sheet1_arealist = ['B2','B3','B4','B5','B6','B7','B8','B9','B10'] wb2_sheet1_arealist_ext = ['C2','C3','C4','C5','C6','C7','C8','C9','C10'] for pos1 in wb1_sheet1_arealist: print("-" * 40) from_target_key = wb1_sheet1[pos1].value print(pos1,from_target_key) output = "一致なし" for pos2,pos3 in zip(wb2_sheet1_arealist,wb2_sheet1_arealist_ext): to_target_key = wb2_sheet1[pos2].value if from_target_key == to_target_key: to_target_ext = wb2_sheet1[pos3].value output = 'file2のB列=' + to_target_key + ',file2のC列=' + to_target_ext print(output) print ('end')

しかし、これですとfile1のセルB1とfile2のセルB2で一致した場合、
file1のセルB2とfile2のセルB3~B10の比較で一致しなくても
一致しているという結果になってしまいます。
そのため、一致しない場合には「一致なし」と出力したいです。

もしくは、もう少し簡単な構文で、「ファイルを比較し、一致するセルのみを抽出する」
方法をご教示頂けますと大変助かります。

何卒よろしくお願い致します。
イメージ説明
イメージ説明

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

meg_

2020/09/20 16:17

・コードは「コードの挿入」で記入してください。 ・エクセルファイルのサンプル画像を掲載出来ませんか?
hana_yama_san

2020/09/20 18:16

winmergeを使えば簡単に出きることを、 なんでわざわざPyhtonで実装するのですか。 Pythonなら他に試してみるべき事は 山ほどあるでしょう。
DangerousKT

2020/09/21 13:08

meg_様>コメントありがとうございます。 コードを「コードの挿入」で入れ直しました。 併せてエクセルファイルのスクショを添付させて頂きました。 恐れ入りますが何卒よろしくお願い致します。
DangerousKT

2020/09/21 13:14

hana_yama_san様>コメントありがとうございます。 会社の業務においてPython習得の一環として「pythonでエクセルファイルを比較するプログラムを作成し業務改善を図る」という事を個人目標と掲げており、後には引けない状況であるため、この様な質問をさせて頂いている次第です。 どうぞよろしくお願い致します。
hana_yama_san

2020/09/21 14:02 編集

>>個人目標と掲げており それがあなたが本当にやりたいことなら、ま、良いでしょう。 誰かのアドバイス(or空気を読んだ・忖度)とかだと気のどくですね。 最適解ではなく妥当解を提出して、 本当にやりたいことに邁進してください。 正直に言って「クソ」な設問だと思います。 ・・・ちょっと解答欄には書きにくいですが。
guest

回答2

0

pandas版も示します。かなり単純にコーディングできることが分かると思います。計算するコードはなんと1行のみです。
なお、予め、pandas、xlrdを、pipでインストールしてください。

Python

1import pandas as pd 2 3# Excelからデータフレームを読み出す 4df1 = pd.read_excel('c:/py/file1.xlsx', sheet_name='Sheet1', header=None, index_col=None) 5df1 = df1.iloc[1:10, 1:2] # B2〜B10のセルを抽出 6df2 = pd.read_excel('c:/py/file2.xlsx', sheet_name='Sheet1', header=None, index_col=None) 7df2 = df2.iloc[1:10, 1:3] # B2〜C10のセルを抽出 8 9# df2から「IPがdf1のどれかに存在している」行のみ抽出する 10df_out = df2[df2[0].isin(df1[0])] 11 12# 抽出したデータフレームを表示する 13for _, col in df_out.iterrows(): 14 output = 'file2のB列=' + col[0] + ',file2のC列=' + col[1] 15 print(output) 16 17print ('end')

投稿2020/09/21 04:19

編集2020/09/21 07:18
toast-uz

総合スコア3266

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

DangerousKT

2020/09/21 13:16

toast-uz様>ご回答ありがとうございます!!! まずは、早速試してみて、結果をご報告させて頂きます。 引き続きよろしくお願い致します。
DangerousKT

2020/09/21 15:23

toast-uz様>お陰様で望んでいた出力結果を得る事ができました。 修正頂きましたソースコードを元にして、引き続き業務利用に適したプログラムを作成していきたいと思います。 大変お世話になりました! 本当にありがとうございます!
guest

0

ベストアンサー

もとのコードをなるべく生かして、「ファイルを比較し、一致するセルのみを抽出する」を実現してみました。

一致するセルは別の行であってもよい、と解釈しました。fromのIPアドレスのリストを先に作ってからtoのIPアドレスがリストに含まれるかどうかを判定するのが、ポイントです。同一行のみ一致判定するのであれば回答は変わります。

なお、Pythonで複雑な表計算をするのであれば、pandasを利用することをお勧めします。pandasにもExcelを読み書きする機能があります。

Python

1import openpyxl 2 3wb1 = openpyxl.load_workbook('c:/py/file1.xlsx') 4wb1_sheet1 = wb1['Sheet1'] 5wb1_sheet1_arealist = ['B2','B3','B4','B5','B6','B7','B8','B9','B10'] 6 7wb2 = openpyxl.load_workbook('c:/py/file2.xlsx') 8wb2_sheet1 = wb2['Sheet1'] 9wb2_sheet1_arealist = ['B2','B3','B4','B5','B6','B7','B8','B9','B10'] 10wb2_sheet1_arealist_ext = ['C2','C3','C4','C5','C6','C7','C8','C9','C10'] 11 12# fromのIPアドレスのリストを作る 13from_target_keys = [] 14for pos1 in wb1_sheet1_arealist: 15 from_target_keys.append(wb1_sheet1[pos1].value) 16 17# 一致したIPアドレスと用途のみ抽出するための空のリストを用意する 18output_list = [] 19 20for pos2, pos3 in zip(wb2_sheet1_arealist, wb2_sheet1_arealist_ext): 21 to_target_key = wb2_sheet1[pos2].value 22 to_target_ext = wb2_sheet1[pos3].value 23 # toのIPアドレスが、fromのIPアドレスのリストに含まれるか確認する 24 if to_target_key in from_target_keys: 25 # 含まれていたら抽出リストに加える 26 output_list.append((to_target_key, to_target_ext)) 27 28# 抽出リストを表示する 29for to_target_key, to_target_ext in output_list: 30 output = 'file2のB列=' + to_target_key + ',file2のC列=' + to_target_ext 31 print(output) 32 33print ('end')

投稿2020/09/21 02:34

toast-uz

総合スコア3266

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問