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

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

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

openpyxlは、Excel2007以降のファイル(xlsx/xlsm/xltx/xltm)を読み書きするためのPythonライブラリです。

Python

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

Q&A

解決済

3回答

2934閲覧

python/for文IF文で リストに含まれる値をセルから取り出して、リストの値を参照してセットで取り出しできますか

dub

総合スコア23

openpyxl

openpyxlは、Excel2007以降のファイル(xlsx/xlsm/xltx/xltm)を読み書きするためのPythonライブラリです。

Python

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

0グッド

0クリップ

投稿2021/07/21 00:47

編集2021/07/21 03:22

##読み込みしたExcelの値が、リストの複数の値のどれかの値に一致する場合、処理をスキップしたい。1つだと実行できるが変数だとエラーになる

python で openpyxl で 顧客の注文内容を読み込みし、順番に2列目のセルの値を取得していきます(処理分の内容)

その際に、特定の商品番号(複数)と一致する場合は、そのセルをスキップし次の商品番号を取得したい場合

1つの値 <例>商品番号3 
x=(3)
if (ws1.cell(row,2).value) == x:とすると
思い通りに 11行目の商品番号3をスキップして実行できましたが、
これを 1つの値ではなく、複数の値と一致する値をスキップしたい

例:取得しない商品番号のリストを作成しておいて、
セルで読み込みした値が、リストの商品番号に一致する場合はスキップ
リスト 商品番号3 商品番号6
取得して実行するのは りんご、みかん、メロン
(商品番号 3 バナナ 商品番号6 いちご はスキップしたい)

python

1x=(3)#商品番号の値 1つだと正常に動作(3をスキップする) 2from openpyxl import Workbook 3from openpyxl import load_workbook 4wb = load_workbook('./customer.xls') 5ws = wb['Sheet1'] 6 7for row in range(9,ws1.max_row): 8 9 if (ws1.cell(row,2).value) == x:#1つの値だと正常に動作(11行目の商品番号3をスキップして処理文と実行する→複数のリストの変数ではエラーになる 10 continue 11 if(ws1.cell(row,2).value is None): 12 break 13 処理文 14

customer.xlsの内容
|見出し行|商品番号|数量|商品名|
|:--|:--:|--:|
|9行目|10530|10|りんご
|10行目|20433|20|みかん
|11行目|3|30|バナナ
|12行目|6|80|いちご
|14行目|4005|5|メロン

複数の値を参照されるにはどうしたらいいのでしょうか?
for文で リスト1つずつ参照しても 出来ませんでした

python

1lists= [3,6]#商品番号3と商品番号6 複数の値を参照したい 2from openpyxl import Workbook 3from openpyxl import load_workbook 4wb = load_workbook('./customer.xls') 5ws = wb['Sheet1'] 6 7for row in range(9,ws1.max_row): 8 9 for x in lists: 10 if (ws1.cell(row,2).value) == x: 11 12 continue 13 if(ws1.cell(row,2).value is None): 14 break 15 処理文

ありがとうございます if ws1.cell(row,2).value in lists:で スキップ出来ました!
追加の質問させてください

追加質問
逆に 読み込みしているセルに商品番号が含まれる場合に、continueでスキップするのではなく
セルに含まれていた商品番号と、その右の数量を取得できますか?

さらに先程の例では、customer.xls のセルに 商品名が含まれていましたが、実際には 商品番号と数量だけで
商品名は読み込みしたシートの値は記入されていませんでした

そこで、lists の抜き出したい リストの方に、商品名と価格を記載しておき、
商品番号(リストの値がセルに存在する番号)・数量(セルに商品番号が存在する時の右列)・商品名(listsの方から参照)・価格(listsの方から参照) をセットにして取り出しするには
どうしたらいいのでしょうか・・・

セルの内容が下記のように 商品番号と数量の2つだけのリストだった場合(商品名・価格は記載されていない)

読み込みしたセルに リストの商品番号が存在する場合の、セルの値、セルの数量、特定のリストから商品番号が一致する商品名と価格 4つをセットにして取り出しできますか?
◆要するに、特定のリスト(番号・商品名・価格)の番号で 読み込みセルを検索して 含まれている番号がある場合、数量を取り出して、特定のリスト3つに数量1つをセットにして
4つの値を取得したいです
(取り出した4つの値は、pandasのDataframeに追加したい)

具体例
特定のリスト(除外する商品番号・商品名・価格 と3つセットで登録しておきたい

3:バナナ:¥100
6:いちご:¥300
(実際には10個程度 別処理したい商品番号が存在する)

読み込みセル

見出し行商品番号数量
9行目1053010
10行目2043320
11行目330
12行目680
14行目40055

##下記のデータ4つをセットにして取得したい(後にpandasのdataframeに追記したい)
3(特定のリストでセルに存在する商品番号):バナナ:¥100 30個 ←数量をセルから取得
6(特定のリストでセルに存在する商品番号):いちご:¥300 80個 ←数量をセルから取得

まだ初心者で 辞書型を使ったらできるのかな?と思うものの、2つ以上の値を辞書で登録できるかどうかもわからず・・
何卒 ヒントをいただけますと幸いです
◆前提とする問題と 大きく変わってしまったので、再質問にするかもしれません。

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

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

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

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

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

guest

回答3

0

ベストアンサー

pythonで、あるものがリストに含まれているかどうかを判定するときは、「in」を使います。

値がlistsに入っているとしたら、

python

1 if ws1.cell(row,2).value in lists:

で、判定できます。


他の質問をするなら、別の質問をして立てたほうが他の人に別りやすいですよ。

こんなやり方はどうでしょうか。

まずは、商品番号をキーとしたマスターデータを作ります。

python

1master_data = 2{"10530": {'商品名': 'りんご', '単価': 100'}, 3 "20433": {'商品名': 'みかん', '単価': 50'}, 4 "3": {'商品名': 'バナナ', '単価': 10'}, 5 "6": {'商品名': 'いちご', '単価': 200'}}

チェックするときに、マスターデータのキーでチェックして、そのキーから情報を取り出します。

python

1if ws1.cell(row,2).value in master_data.keys(): 2 item_id = ws1.cell(row,2).value #わかりやすくするため。 3 item_name = master_data[item_id]['商品名'] 4 item_unit_price = master_data[item_id]['単価']

あとはdfに入れるなりなんなりしてください。

投稿2021/07/21 00:53

編集2021/07/21 04:56
TakaiY

総合スコア12765

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

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

dub

2021/07/21 03:25

ありがとうございます!無事できました。その後、違う処理の質問を追加質問させて頂いております。何卒ヒント等頂けましたら幸いです
TakaiY

2021/07/21 05:32

追加しときました。
dub

2021/07/21 08:39

ありがとうございます!マスターデータを作って、キーを参照して、マスターデータから値を引っ張ってくるのが理解できました!数量(セルでヒットした商品番号の数量)がわからないのですが、 頂いたヒントをもとに、再度 頭を整理します
TakaiY

2021/07/21 09:36

数量 は商品番号(ws1.cell(row,2))のとなりですからわかるのでは?
guest

0

python

1if (ws1.cell(row,2).value) in lists:

投稿2021/07/21 00:52

ozwk

総合スコア13521

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

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

dub

2021/07/21 03:25

ありがとうございます!無事できました。その後、違う処理の質問を追加質問させて頂いております。何卒ヒント等頂けましたら幸いです
guest

0

python

1for row in range(9,ws1.max_row): 2 3 for x in lists: 4 if (ws1.cell(row,2).value) == x: 5 6 continue 7 if(ws1.cell(row,2).value is None): 8 break 9 処理文

とすると
xが3の時には商品番号6がスキップされませんし、
xが6の時には商品番号3がスキップされません。

以下に変更してください

python

1for row in range(9,ws1.max_row): 2 if (ws1.cell(row,2).value) in lists: 3 continue 4 if(ws1.cell(row,2).value is None): 5 break 6 処理文

投稿2021/07/21 00:51

編集2021/07/21 01:04
ppaul

総合スコア24666

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

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

dub

2021/07/21 03:25

ありがとうございます!無事できました。その後、違う処理の質問を追加質問させて頂いております。何卒ヒント等頂けましたら幸いです
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問