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

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

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

Kerasは、TheanoやTensorFlow/CNTK対応のラッパーライブラリです。DeepLearningの数学的部分を短いコードでネットワークとして表現することが可能。DeepLearningの最新手法を迅速に試すことができます。

openpyxl

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

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Python

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

Q&A

解決済

2回答

1304閲覧

Python if not文がうまく動作しません

SuzuAya

総合スコア71

Keras

Kerasは、TheanoやTensorFlow/CNTK対応のラッパーライブラリです。DeepLearningの数学的部分を短いコードでネットワークとして表現することが可能。DeepLearningの最新手法を迅速に試すことができます。

openpyxl

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

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Python

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

0グッド

0クリップ

投稿2021/02/13 12:38

編集2021/02/13 22:50

前提・実現したいこと

以下コードのif not文とelseの部分がうまく動作しません。
if文とif not文を同時に満たす条件を定義したい場合、コードをどのように書き換えればいいでしょうか。

【実現したいこと】
エクセルブックの「train」シートの2行目から1行ずつ読み込み、以下の処理を行う
①読み込んだ行の15列目が空白かつ、15列目全体にimage_nameの値が入っていない場合:読み込んだ行の15列目に同行13列目のimage_nameの値を代入する
②読み込んだ行の15列目が空白だが、15列目のいずれかに同じimage_nameの値が入っている場合:読み込んだ行の16列目に同行14列目のbbox_infoの値を代入する

学習させたいのは肺のX線画像であり、trainシートには、15000枚分の学習用画像名や、分類ラベルや、疾患部分のbounding box情報が記載されています。必要な情報のみ抽出してテキストファイルに転記したく、その前準備として上記のことを実現したいと思っています。
画像は15000枚ですが、複数の所見がある場合、同じ画像の情報が複数の行に分かれて記載されているため、テキストファイルへの転機の際に重複が起きぬよう、上記のような処理を取りたい次第です。

該当のソースコード

Python

1import datetime 2import openpyxl 3 4xlsx_file = "train.xlsx" 5 6# エクセルブック 7wb = openpyxl.load_workbook(xlsx_file, data_only=True) 8 9# エクセルシート 10ws = wb["train"] 11 12max_row = wb["train"].max_row 13#print(max_row) 14 15for row in range(1,max_row + 1): 16 image_name = ws.cell(row = row+1 , column = 13).value 17 bbox_info = ws.cell(row = row+1 , column = 14).value 18 #print(image_name) 19 #print(bbox_info) 20 if ws.cell(row = row+1 , column = 15).value is None: 21 if not image_name in ws['O2':'O67916']: 22 ws.cell(row = row+1 , column = 15).value = image_name 23 ws.cell(row = row+1, column = 16).value = bbox_info 24 else: 25 ws.cell(row = row+1 , column = 16).value = bbox_info 26 27#エクセルの保存 28wb.save(filename = xlsx_file) 29

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

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

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

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

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

ppaul

2021/02/13 13:47

うまくいかないというのは、SuzuAyaさんの期待する動きと、ソースコードの実際の動きが違うということですね。 ソースコードは見ればわかりますが、SuzuAyaさんの期待する動きが書かれていないので、問題点がわかりません。どういう結果を期待しているかを言葉で書いてくれませんか。
SuzuAya

2021/02/13 14:34

>ppaul様 コメントありがとうございます!色々説明が不足しており申し訳ございません。 ws.cell(row = row+1 , column = 15)が空白セルかつ、wsのO2からO67916の範囲にimage_nameの値がない場合、ws.cell(row = row+1 , column = 15)に image_nameの値を代入、ws.cell(row = row+1, column = 16).にbbox_infoの値を代入したいです。 もし、上記の条件に当てはまらない場合、ws.cell(row = row+1, column = 16)にbbox_infoの値を代入したいです。 分かりにくい部分がありましたら、お手数ですが再度お知らせいただけますと幸いです。 どうぞよろしくお願いいたします。
guest

回答2

0

ベストアンサー

if notとは無関係のように見えます。

image_name in ws['O2':'O67916']

は、セルのリストの中にimage_nameがあるかという文なので、常にFlaseです。
そのために

not image_name in ws['O2':'O67916']:

は常にTrueになります。
これは、SuzuAyaさんの求めるものとは違っているでしょう。

if not image_name in ws['O2':'O67916']:
の部分を
if [cell for cell in ws['O2':'O67916'] if cell.value == image_name] == []:
に変更すれば、性能問題は別にして動くでしょう。

また本題とは関係ないかもしれませんが、

for row in range(1,max_row + 1):
は、1~max_rowでループします。
max_rowのとき、
if ws.cell(row = row+1 , column = 15).value is None:
は、常に成り立ちますが、それで良いのですか。

投稿2021/02/13 15:11

ppaul

総合スコア24670

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

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

SuzuAya

2021/02/13 22:51

>ppaul様 ご丁寧なご回答を誠にありがとうございます!私の説明が不十分であったため、お手間を取らせてしまい申し訳ありません。質問内容に、実現したいことの詳細を追記させていただきましたので、ご確認いただけますと幸いです。どうぞよろしくお願いいたします。
ppaul

2021/02/13 23:04

昨日の回答で、問題点の一つはなくなると思います。 修正したコードで、どうなったかを教えてください。
SuzuAya

2021/02/14 12:33

コメントに気がつくのが遅くなり、申し訳ございません。 if not image_name in ws['O2':'O67916']: の部分を if [cell for cell in ws['O2':'O67916'] if cell.value == image_name] == []: に変更したところ、以下のエラーが出てしまいました。 AttributeError: 'tuple' object has no attribute 'value'
SuzuAya

2021/02/14 12:46

たびたび申し訳ありません、私がやりたいことについてすでに質問をされている方がいらっしゃいました。https://teratail.com/questions/140511 こちらを参考に、一度コードを書きなおしてみます。その際、またエラーや不明点など生じましたらこちらに再度質問をさせていただきたいと思います。 貴重なお時間をたくさん使っていただき、ありがとうございました。引き続きどうぞよろしくお願いいたします。
SuzuAya

2021/02/14 23:42

修正いただいたコードで、うまくいきました!! この度はご丁寧にありがとうございました。大変助かりました。
guest

0

同時に満たす条件を定義したい場合

and ってはなしかな

投稿2021/02/13 12:50

y_waiwai

総合スコア88042

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

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

SuzuAya

2021/02/13 12:58 編集

>y_waiwai様 ご回答ありがとうございます!ご提案いただいたとおり、andでつなげたりもしたのですが、うまくいかなかったんです。 if ws.cell(row = row+1 , column = 15).value is None and not image_name in ws['O2':'O67916']: 何か他にも間違っていることがあるのでしょうか。
y_waiwai

2021/02/13 13:06

カッコで囲いましょう if(なんたら)and(かんたら):
SuzuAya

2021/02/13 22:37

>y_waiwai様 ありがとうございます。カッコで囲んでもうまくいかなかったので、コードの中身を修正する必要がありそうです。お時間をとっていただき、ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問