🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Python 3.x

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

シリアルポート

シリアルポートは一度に一ビットごと移行される物理的なインターフェイスです。一般的には、9ピンのd-subコネクタであるRS-232を指します。

リストボックス

ユーザーがリストから1つ以上のアイテムを選択できるようにするGUI要素です。

連結リスト

連結リストとは、データ構造のひとつであるリストの中で、要素が前後の要素の情報を持つことで、要素が連結(リンク)しているリストの事を呼びます。

Arduino

Arduinoは、AVRマイコン、単純なI/O(入出力)ポートを備えた基板、C言語を元としたArduinoのプログラム言語と、それを実装した統合開発環境から構成されたシステムです。

Q&A

解決済

2回答

6326閲覧

Pythonのreadline()で読み込んだstrを2行ずつリストにしたい。

退会済みユーザー

退会済みユーザー

総合スコア0

Python 3.x

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

シリアルポート

シリアルポートは一度に一ビットごと移行される物理的なインターフェイスです。一般的には、9ピンのd-subコネクタであるRS-232を指します。

リストボックス

ユーザーがリストから1つ以上のアイテムを選択できるようにするGUI要素です。

連結リスト

連結リストとは、データ構造のひとつであるリストの中で、要素が前後の要素の情報を持つことで、要素が連結(リンク)しているリストの事を呼びます。

Arduino

Arduinoは、AVRマイコン、単純なI/O(入出力)ポートを備えた基板、C言語を元としたArduinoのプログラム言語と、それを実装した統合開発環境から構成されたシステムです。

0グッド

0クリップ

投稿2019/12/19 13:28

編集2019/12/20 11:10

Pythonのreadline()で読み込んだstrを2行ずつリストにしたい。
ArduinoからPCへシリアル通信で送信した結果をpythonのreadline()で読み込み、データ型をbyteからstrに変換しprintで出力しています。
(途中、データ型を確認しprintで表示や、現在時刻をprintで表示させているため見づらくなってしまい申し訳ありません。)

行いたいことは冒頭で記載させていただいてる通りです。
図のプログラム出力結果の['35.~~~~~~~\r\n']と['139.~~~~~~~\r\n']の2行ずつを
[35.~~~~~~~,139.~~~~~~~]のようなリストにしたいです。

python初学者のため、説明不十分、ミス等、多々あると思いますが、ご教授頂けると幸いです。

Python

1import pandas as pd 2import numpy as np 3import serial 4import datetime 5 6ser = serial.Serial() 7ser.port = "COM6" 8ser.baudrate = 9600 9ser.timeout = None 10ser.open() 11try: 12 while True: 13 line = ser.readline() 14 line1 = line.decode() 15 print(line1.split(',')) 16 print(type(line1)) 17 dt_now = datetime.datetime.now() 18 time = dt_now 19 times = time.strftime('%Y-%m-%d %H:%M:%S \n') 20 print(time) 21 path_w = 'C:/Users/LattePanda/test/testgps2.txt' 22 with open(path_w, mode='a') as f: 23 f.write(line1) 24 path_w = 'C:/Users/LattePanda/test/testtime.txt' 25 with open(path_w, mode='a') as f: 26 f.write(times) 27except: 28 pass 29ser.close()

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

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

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

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

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

guest

回答2

0

with open(path_w, mode='a') as f: f.write(line1)

の部分をつぎのような感じ (実際に動作させての確認はしていない) にするとできそうな気がします

line2 = "" with open(path_w, mode='a') as f: if line2 == "": line2 = line1.splitlines()[0] continue f.write(line2 * "," + line1.splitlines()[0]) line2 = ""

投稿2019/12/19 22:32

katoy

総合スコア22324

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

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

退会済みユーザー

退会済みユーザー

2019/12/20 00:35

返信、参考プログラムまでありがとうございます。参考にさせて頂きます。 説明不足故、分かりにくくなっていて申し訳ないのですが、 当方、読み込んだ最新の緯度経度(ここでは35.〜,139.〜にあたります)のみリスト化したいと考えています。(アドバイス頂けると幸いです) 読み込んだ最新の緯度経度が目的地付近の緯度経度になったら、ある処理を行うようなプログラムを今後書きたいと考えているので。
退会済みユーザー

退会済みユーザー

2019/12/20 06:44

import pandas as pd import numpy as np import serial import datetime ser = serial.Serial() ser.port = "COM6" ser.baudrate = 9600 ser.timeout = None ser.open() try: while True: line = ser.readline() line1 = line.decode() print(line1.split(',')) print(type(line1)) #value = list(line1) #print(value) dt_now = datetime.datetime.now() time = dt_now times = time.strftime('%Y-%m-%d %H:%M:%S \n') print(time) path_w = 'C:/Users/LattePanda/test1/testgps2.txt' line2 = "" with open(path_w, mode='a') as f: if line2 == "": line2 = line1.splitlines()[0] continue f.write(line2 * "," + line1.splitlines()[0]) line2 = "" path_w = 'C:/Users/LattePanda/test1/testtime.txt' with open(path_w, mode='a') as f: f.write(times) except: pass ser.close() ご指摘の通り変えてみましたが、テキストに上手く書き込めませんでした。
guest

0

ベストアンサー

2行読んできて必要とあらば改行を削除してコンマで区切って連結すればいいって話ですね
ってそのまんま実装すればどうでしょう

投稿2019/12/19 13:33

y_waiwai

総合スコア88038

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

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

退会済みユーザー

退会済みユーザー

2019/12/20 00:29

度々の返信ありがとうございます! 参考にしてみます!
y_waiwai

2019/12/20 00:33

strip()で前後のスペース/改行が削除できますわな
退会済みユーザー

退会済みユーザー

2019/12/20 10:49

今回僕の場合はGPSから取得した緯度経度を上記のように表示させています。 更新された最新の2行のみ随時取り出し、リストにすることって可能ですかね? (ちなみに、y_waiwaiさんが今回の最初のコメントくださったことは未だ実現できてません。参考プログラム等くださると本当に助かります)
退会済みユーザー

退会済みユーザー

2019/12/20 11:13

追記 import pandas as pd import numpy as np import serial import datetime ser = serial.Serial() ser.port = "COM6" ser.baudrate = 9600 ser.timeout = None ser.open() try: while True: line = ser.readline() line1 = line.decode() print(float(line1)) 現状strでの出力floatに変えて出力することで、 35.~ 138.~ 35.~ 138.~ というように出力させています。
y_waiwai

2019/12/20 13:07

line = ser.readline() line1 = line.decode() line = ser.readline() line2 = line.decode() にして、それぞれstripして、line=line1+','+line2 でいいんじゃないかと
退会済みユーザー

退会済みユーザー

2019/12/22 09:57

import pandas as pd import numpy as np import serial ser = serial.Serial() ser.port = "COM6" ser.baudrate = 9600 ser.timeout = None ser.open() try: while True: line = ser.readline() line1 = line.decode() line = ser.readline() line2 = line.decode() line3 = line1.strip() line4 = line2.strip() line5 = line4 + ',' + line3 fl1 = float(line3) fl2 = float(line4) P = line5.split(',') print(line3) print(line4) print(P) print(fl1) print(fl2) except: pass ser.close() アドバイス頂いた通りプログラムを書いてみたのですが、 僕が書いた上記のプログラムだと、プログラム実行のタイミングによって、 line3が緯度になったり経度になったり変化してしまいます。(line4も同様) それ故、プログラム実行タイミングによってline5が(緯度、経度)、(経度、緯度)、(緯度、緯度)、(経度、経度)の4通りとなってしまいます。(whileループ中に(緯度、経度)→(経度、緯度)etc.. となっている訳ではないです) 解決する方法等ありましたら、ご教授願いたいです。 度々になってしまい申し訳ありません。
y_waiwai

2019/12/22 10:04

そもそも、どういうデータが送信/受信されてるのかきっちり確認しよう で、緯度と経度のデータの区別はどうしてるんですか?
退会済みユーザー

退会済みユーザー

2019/12/23 02:11

#include <TinyGPS++.h> TinyGPSPlus gps; void setup() { Serial.begin(9600); while (!Serial) { ; } Serial1.begin(9600); while (!Serial1) { ; } } void loop() { while (Serial1.available() > 0) { char c = Serial1.read(); gps.encode(c); if (gps.location.isUpdated()) { Serial.println(gps.location.lat(),9); Serial.println(gps.location.lng(),9); delay(1000); } } } Arduinoからは上記プログラムの通り緯度経度をそれぞれ送信しています。 区別はしてませんが、pythonのプログラム上にif文で緯度、経度間で数が大きい方を経度として採用するといった内容を書いてみましたが、(緯度、緯度)、(経度、経度)で読み込んだ場合の対応が出来なくて、困っています。arduinoから送信の際に区別させられる方法等、知っていましたらご教授お願いします。
y_waiwai

2019/12/23 02:19

区別せずに送信してるなら、受信側も区別ができないわけで、 そこらへんからどうにかする必要があります って、 Serial.print(gps.location.lat(),9); Serial.print(","); Serial.println(gps.location.lng(),9); で、送信側で1行にしたら済む話じゃない?
退会済みユーザー

退会済みユーザー

2019/12/25 03:10

無事できそうです。 ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問