Уведомления

Группа в Telegram: @pythonsu

#1 Март 29, 2021 20:05:22

staxbel
Зарегистрирован: 2021-03-13
Сообщения: 45
Репутация: +  0  -
Профиль   Отправить e-mail  

Запись в БД с условием

Всем доброго дня. получаю данные с последовательного порта, и записываю 8 байт данных в БД, но есть проблема, иногда в данных появляется мусор таких данных хочу избежать. Может есть возможность записать в БД данные которые имеют только цифры, если условие не выполнено - просто продолжаем дальше. Сейчас код у меня выглядит так:

 import serial
import time
import datetime
import db
from datetime import datetime
while True :
    connection = db.getConnection()
    #print ("Соединение установлено")
    ser = serial.Serial('COM3', timeout=1)
    cmd = bytearray([0x3])
    ser.write(cmd)
    reply = ser.read(22)
    out = reply[11:16]
    print(out)
    ser.close()
    try :
        cursor = connection.cursor()
        sql = "Update silos3 set weight = %s, date = %s where id = %s " 
        datetime.strptime("12/31/2000", "%m/%d/%Y")
        newHireDate = datetime.today()
        rowCount = cursor.execute(sql, (out, newHireDate, 1 ) )
        connection.commit() 
        print ("Данные изменены", newHireDate)
    finally:
        # Закрыть соединение
        connection.close()

Офлайн

#2 Март 30, 2021 12:47:40

PEHDOM
Зарегистрирован: 2016-11-28
Сообщения: 2196
Репутация: +  294  -
Профиль   Отправить e-mail  

Запись в БД с условием

staxbel Зачем вы каждый раз открываете и закрываете последовательный порт, а так же соединение с БД еслиесли вы бесконечно дрочите порт без каких либо задержек?

staxbel
Может есть возможность записать в БД данные которые имеют только цифры, если условие не выполнено - просто продолжаем дальше.
Ну в out у вас байты, пербразуйте в строку, и посмотрите. Для этого в пайтоне есть метод str.isdigit()
 '123'.isdigit()  # True
 'abc123'.isdigit()  # False
типа :
 out_srt = out.decode('сюда_вписать_кодировку_в_которой_вы_получаете_данные') # тут вы можете поймать исключение если у вас там будет таки реальный "мусор", поэтому лучше вставить его в блок try-excrpt и отслеживать DecodeError
if out_str.isdigit():
    #тут пишем в БД
else:
   #тут не пишем в БД



==============================
Помещайте код в теги:
[code python][/code]
Бериегите свое и чужое время.

Отредактировано PEHDOM (Март 30, 2021 12:52:45)

Офлайн

#3 Март 30, 2021 14:52:09

Rodegast
От: Пятигорск
Зарегистрирован: 2007-12-28
Сообщения: 2679
Репутация: +  182  -
Профиль   Отправить e-mail  

Запись в БД с условием

 >>> '123.15'.isdigit()
False



С дураками и сектантами не спорю, истину не ищу.
Ели кому-то правда не нравится, то заранее извиняюсь.

Офлайн

#4 Март 30, 2021 14:56:14

PEHDOM
Зарегистрирован: 2016-11-28
Сообщения: 2196
Репутация: +  294  -
Профиль   Отправить e-mail  

Запись в БД с условием

Rodegast естевенно, точка не цифра.



==============================
Помещайте код в теги:
[code python][/code]
Бериегите свое и чужое время.

Офлайн

#5 Март 30, 2021 15:06:07

Rodegast
От: Пятигорск
Зарегистрирован: 2007-12-28
Сообщения: 2679
Репутация: +  182  -
Профиль   Отправить e-mail  

Запись в БД с условием

> точка не цифра.

Да, но 123.15 является числом. По этому я не рекомендовал бы пользоваться этими методами.



С дураками и сектантами не спорю, истину не ищу.
Ели кому-то правда не нравится, то заранее извиняюсь.

Офлайн

#6 Март 30, 2021 16:24:16

PEHDOM
Зарегистрирован: 2016-11-28
Сообщения: 2196
Репутация: +  294  -
Профиль   Отправить e-mail  

Запись в БД с условием

ну так естевенно что проверять нужно на то на что нужно Если нужно на цифры то на цифры, если на числа то на числа. Топикстартер говорит что должны быть “данные которые имеют только цифры”. для этого isdigit() вполне подходит.



==============================
Помещайте код в теги:
[code python][/code]
Бериегите свое и чужое время.

Офлайн

#7 Март 30, 2021 17:00:08

Rodegast
От: Пятигорск
Зарегистрирован: 2007-12-28
Сообщения: 2679
Репутация: +  182  -
Профиль   Отправить e-mail  

Запись в БД с условием

> Топикстартер говорит что должны быть “данные которые имеют только цифры”

Часто топикстартеры не знают чем числа отличатся от цифр.



С дураками и сектантами не спорю, истину не ищу.
Ели кому-то правда не нравится, то заранее извиняюсь.

Офлайн

#8 Март 30, 2021 21:24:45

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 9716
Репутация: +  842  -
Профиль   Отправить e-mail  

Запись в БД с условием

staxbel
Может есть возможность записать в БД данные которые имеют только цифры, если условие не выполнено - просто продолжаем дальше.
Можешь выбрать цифры
  
def select_data(data):
    tmp = data[11:16]
    digits = bytes(i for i in tmp if chr(i).isdigit())
    out = digits
    return out
 
...
 
reply = ser.read(22)
clean_data = select_data(reply)
В clean_data будут выбраны цифры.

Принцип работы
  
>>> def select_data(data):
...     tmp = data[11:16]
...     digits = bytes(i for i in tmp if chr(i).isdigit())
...     out = digits
...     return out
... 
>>> bytes([0x40, 0x32, 0x41, 0x33] * 10)
b'@2A3@2A3@2A3@2A3@2A3@2A3@2A3@2A3@2A3@2A3'
>>> 
>>> select_data(bytes([0x40, 0x32, 0x41, 0x33] * 10))
b'323'
>>>

Если же надо определять, имеют ли данные только цифры, то также надо написать функцию
  
def select_data(data):
    out = data[11:16]
    return out
 
def check_data(data):
    out = data.isdigit()
    return out
 
...
 
reply = ser.read(22)
clean_data = select_data(reply)
f_data_onlydigits = check_data(clean_data)
В clean_data будут выбранные данные из ответа, а в f_data_onlydigits будет True или False в зависимости от того, состоят ли выбранные данные только из цифр.

Принцип работы
  
>>> def check_data(data):
...     out = data.isdigit()
...     return out
... 
>>> bytes([0x40, 0x32, 0x41, 0x33] * 10)
b'@2A3@2A3@2A3@2A3@2A3@2A3@2A3@2A3@2A3@2A3'
>>> 
>>> check_data(bytes([0x40, 0x32, 0x41, 0x33] * 10))
False
>>> 
>>> bytes([0x33, 0x32, 0x35, 0x33] * 10)
b'3253325332533253325332533253325332533253'
>>> 
>>> check_data(bytes([0x33, 0x32, 0x35, 0x33] * 10))
True
>>>

По поводу всех разговоров про целые числа или вещественные числа или рациональные дроби там - всё это проверяется внутри функции check_data() путём дописывания её содержимого, которое также может вызывать вспомогательные функции, которые пишутся для проверки отдельных вопросов. Функции вызывают функции, которые вызывают функции, которые вызывают функции и так далее.



Отредактировано py.user.next (Март 30, 2021 21:31:32)

Офлайн

#9 Март 30, 2021 21:36:58

PEHDOM
Зарегистрирован: 2016-11-28
Сообщения: 2196
Репутация: +  294  -
Профиль   Отправить e-mail  

Запись в БД с условием

Rodegast
Часто топикстартеры не знают чем числа отличатся от цифр.
ну зато потом их ждет “просветление”



==============================
Помещайте код в теги:
[code python][/code]
Бериегите свое и чужое время.

Офлайн

#10 Март 30, 2021 22:09:44

Rodegast
От: Пятигорск
Зарегистрирован: 2007-12-28
Сообщения: 2679
Репутация: +  182  -
Профиль   Отправить e-mail  

Запись в БД с условием

> Принцип работы

Это ещё один пример того как делать не нужно. Ибо Простое лучше, чем сложное. и Сложное лучше, чем запутанное..



С дураками и сектантами не спорю, истину не ищу.
Ели кому-то правда не нравится, то заранее извиняюсь.

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version