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

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

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

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

Q&A

解決済

1回答

857閲覧

シリアルポートから受信したデータを元に辞書の検索ができません。

trainweather

総合スコア23

Python 3.x

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

0グッド

0クリップ

投稿2018/07/23 10:09

編集2018/07/23 12:47

前回の質問(pythonでシリアルポートからのバイナリデータ受信にてこずっています)の続きです。

無事に'res'という変数に'ab'というデータを取得することができました。

python

1res = ser.readline()[15:19].decode()

この値を元に読み込んだcsvファイルの'ab'を検索し、その戻り値を取得しようとしています。

python

1database = numpy.genfromtxt("database.csv", dtype = str, delimiter=",") 2k = 1 3while k < len(database) - 1: 4 if database[k,0] == res: 5 break 6 k = k + 1 7data = database[k,1]

問題としては'ab'という見出しは存在しているのですが、頭から総当たりをしても一致するものがなく、
毎回最下段の'N/A'を返してしまいます。

一方で直接

python

1res ='ab'

と手動入力した場合は、'ab'に対応する値を戻すことに成功しました。

型はどちらも'str'だったため型の問題でもないようで詰まってしまいました。

---補足1---

python

1res1 = ser.readline()[15:19].decode() 2res2 = "ab" 3print(res1, res2) 4print(res1==res2)

これでデバッグすると

python

1 ab 2False

空白になってるようです。

ちなみに

python

1res1 = ser.readline()[15:19].decode() 2res2 = "ab" 3print(res1) 4print(res2) 5print(res1==res2)

このように記述すると

python

1ab 2ab 3False

こうなりますが、やはりFalseなのは間違いないようです。

---補足2---
'ab'は'str'ではなく'repr'でみると'ab\r\n'もしくは'\x01ab\r'でした。
やっかいなことに2パターン存在するため、普通にスライスで抜き出すのは難しそうです。

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

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

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

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

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

guest

回答1

0

ベストアンサー

とりあえず、表示してデバッグしてください。
こんな感じで。

python

1res1 = ser.readline()[15:19].decode() 2res2 = "ab" 3print(res1, res2) 4print(res1==res2)

補足を受けて

とにかく変なのは事実なので、思いつくままに見てみるしか。

python

1res1 = ser.readline()[15:19].decode() 2print(repr(res1)) 3print(len(res1)) 4for ch in res1: 5 print(res1) 6 print(ord(res1))

これでなんとか怪しいものが見えてくれ・・・。

投稿2018/07/23 10:36

編集2018/07/23 11:19
hayataka2049

総合スコア30933

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

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

trainweather

2018/07/23 10:46

何度もありがとうございます。 デバッグしましたので、確認の方お願いします。
hayataka2049

2018/07/23 11:20

補足しました。正直よくわかっていませんが、まあとにかく見てみるしかないです
trainweather

2018/07/23 12:43

'\x01ab\r' いました、こいつが悪さをしていたみたいです。 前後を切り取る方法も教えていただけると助かります。
trainweather

2018/07/23 12:58

一応開始文字を新たに設定し、前から総当たりして、そこから2文字読み取ると言う方法では成功できました。
hayataka2049

2018/07/23 22:43

res1 = ser.readline()[16:18].decode() ですかね?
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問