LINUX.ORG.RU

Python парсинг строки

 ,


0

3

Есть железка на ком порту. Задача прочитать с нее данные, и распихать по переменным. данные такого вида

18,10,0.00,0.01,500,26.18,32.20,586.39
Пытаюсь делать так:
import serial
ser = serial.Serial( '/dev/ttyUSB1', 9600, timeout=1 )
s = ser.readline()
pm25, pm10, hcho, voc, co2, temp, humidity, summ = s.split(',')
print (pm25)
получаю
python read_air.py 
Traceback (most recent call last):
  File "read_air.py", line 10, in <module>
    pm25, pm10, hcho, voc, co2, temp, humidity, summ = s.split(',')
ValueError: need more than 1 value to unpack

Помогите понять где я дурак

★★★

Ответ на: комментарий от anonymous

Это что, ты наследование показал штоле? Ты унаследуй от foo, че ты тут палки какие то пишешь. Расшифровываю:

foo := block(writeln(a, b, c))

foo1 := foo clone
foo1 setScope(Object clone do(a := 1; b := 2; c := 3)) 
foo1 call // 123

filequest
()
Ответ на: комментарий от filequest

Тебе шашечки или ехать? Тебе нужно, чтобы код делал, что тебе нужно, или еще и чтобы так, как тебе нужно? Я не стану отрицать, что Io — прикольный язычок и погибче Питона. Собственно, по гибкости Питон уступает даже своим прямым конкуррентам. Но и того, что есть, хватает.

Virtuos86 ★★★★★
()
Последнее исправление: Virtuos86 (всего исправлений: 1)
Ответ на: комментарий от Virtuos86

Зачем несколько идентичных блоков кода?

Затем, что часть кода можно перекрывать другим кодом и дополнять. Ты еще спроси зачем слоты в объектах, и зачем они меняются

filequest
()
Ответ на: комментарий от filequest

Нельзя, лол. Но зато можно создать свой класс с __call__. Но непонятно, зачем это всё.

>>> def foo():
...     print(a, b, c)
... 
>>> class foo1(foo.__class__):
...     pass
... 
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: type 'function' is not an acceptable base type
>>> 

anonymous
()
Ответ на: комментарий от Virtuos86

Ты молодец, не то что некоторые адепты, умеешь смотреть трезво на веши. Тут 2 момента. Во первых концептуальная чистота. Чем язык проще, тем легче он масштабируется. Мы имеем всюду универсальный интерфейс. Что касается гибкости, тут проявляется парадокс блаба, видимо. Пока ты делаешь что-то через жопу, тебе кажется что это удобно и достаточно, но когда попробовал нормально, тебя это уже не устраивает.

filequest
()
Ответ на: комментарий от filequest

Бла-бла-бла. Объект-шмобъект.

в ООП все есть объект.

Да. Даже небо, даже звезды, даже Аллах. А что мешает некоторым объектам быть блоками кода? А блоки кода несут в себе подпрограммы. Вот зачем мне делать экземпляры объектов-подпрограмм? Чтобы задавать им лексические окружения, вместо нормальной передачи аргументов?

Какой смысл в объекте foo := block(writeln(a, b, c))? Пишет в вывод неизвестно откуда берущиеся a, b, c?

Virtuos86 ★★★★★
()
Последнее исправление: Virtuos86 (всего исправлений: 1)
Ответ на: комментарий от Virtuos86

А что мешает некоторым объектам быть блоками кода?

ничто не мешает. Но от этого они не перестают быть объектами.

Пишет в вывод неизвестно откуда берущимиеся a, b, c?

почему неизвестно откуда? Это в общем то аналог обычного лексического замыкания, только с первоклассными окружениями, которыми тоже можно манипулировать извне как обычными объектами

filequest
()
Ответ на: комментарий от filequest

Гибкость должна быть ограничена. Когда она не ограничена, появляются страшные легенды w/o Perl.

Virtuos86 ★★★★★
()
Ответ на: комментарий от filequest

аналог обычного лексического замыкания

Нет. Когда у тебя есть лексическое замыкание, ты явно видишь/задаешь скоуп, откуда оно цепляет информацию. Здесь — foo := block(writeln(a, b, c)) — я не вижу никакого явного дефолтного скоупа, эта какая-то метафигня, к которой надо обязательно писать доку, иначе непонятно, как её использовать, если ты, конечно, не бородатый Io-шник, который на лету распознает такие паттерны кодирования.

Virtuos86 ★★★★★
()
Ответ на: комментарий от Virtuos86

С точки зрения обычного погромиста foo выглядит так, будто использует глобальные переменные. Вот будет смеху, если я полезу их искать и не найду. А ведь всего-то надо задать лексический скоуп при вызове foo ^^.

Virtuos86 ★★★★★
()
Ответ на: комментарий от Virtuos86

Вот именно, что в большинстве ЯП окружение создается неявно, а тут ты его явно задаешь, то есть, все наоборот. Впрочем, можно в Io и «традиционным» образом это сделать.

filequest
()
Ответ на: комментарий от Virtuos86

Что касается того, чтобы посмотреть какой скор, нет никаких проблем. Наоборот, если я в JS, например, я захочу посмотреть исходник функции замкнутой на какое то окрудение, например так String(myFunction) то я не увижу там никакого скопа, только код функции, и увидеть его нет никакой возможности. В Io же, я могу его вызвать явно myFunction scope, так что все прозрачно, никакой документации не нужно. Все о чем ты говоришь, реально обстоит с точностью до наоборот

filequest
()
Ответ на: комментарий от I-Love-Microsoft

Вообще в идеале наверно как-то так надо:

>>> from collections import namedtuple
>>> s = "18,10,0.00,0.01,500,26.18,32.20,586.39"
>>> Data = namedtuple("Data", "pm25 pm10 hcho voc co2 temp humidity summ")
>>> Data(*map(float, s.split(',')))
Data(pm25=18.0, pm10=10.0, hcho=0.0, voc=0.01, co2=500.0, temp=26.18, humidity=32.2, summ=586.39)

А проверки не нужны потому что всё равно в данном случае где надо исключения вывалятся.

ei-grad ★★★★★
()

Продолжаю осваивать питон

Накропал скрипт для лога данных с сенсора в БД

#!/usr/bin/python
import os
import time
import serial
import MySQLdb

#подключаем к БД
db = MySQLdb.connect(host="127.0.0.1", 
                     port=3306,
                     user="user",
                      passwd="password",
                      db="air") 
cur = db.cursor()

a = 1
#начинаем читать
while a == 1:
	ser = serial.Serial( '/dev/ttyUSB0', 9600, timeout=10 )
	s = ser.readline()
	sa = s.split(',')
	if len(sa) == 8:
		pm25 = float(sa[0])
		pm10 = float(sa[1])
		hcho = float(sa[2])
		voc = float(sa[3])
		co2 = float(sa[4])
		temp = float(sa[5])
		humidity = float(sa[6])
		summ = float(sa[7])
		unixtime = long(time.time())
#первые несколько  значений вылетают с нулями по пыли, так что их отбрасываем и ждем  нормальных данных с ненулевой пылью
		if pm25 != 0 and pm10 != 0:
			a = 10
			cur.execute( 
			'INSERT INTO data '
	    	'(unixtime, pm25, pm10, hcho, voc, co2, temp, humidity)'
	    	'VALUES'
	    	'(%s, %s, %s, %s, %s, %s, %s, %s)',
	    	(unixtime, pm25, pm10, hcho,  voc,  co2, temp, humidity))        
        	db.commit()
			
db.close()
print('end')

Из неприятных минусов - железка перезагружается при конекте, в т.ч. гасит экран.

Помогите побороть эту бяку.

kombrig ★★★
() автор топика
Последнее исправление: kombrig (всего исправлений: 1)
Ответ на: комментарий от kombrig

Не работал с такими вещами, но это:

ser = serial.Serial( '/dev/ttyUSB0', 9600, timeout=10 )

точно должно находиться внутри цикла, а не перед ним?

evilface ★★
()
Ответ на: комментарий от kombrig

Лучше было всё-таки новую тему создать, на мой взгляд. Вопрос другой, а здесь увидят только трое подписавшихся и кто в трекер вовремя заглянет. А так хоть уведомления придут тем, кто на теги подписан.

evilface ★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.