Форум сайта python.su
Всем доброго дня. получаю данные с последовательного порта, и записываю 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()
Офлайн
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)
Офлайн
>>> '123.15'.isdigit() False
Офлайн
Rodegast естевенно, точка не цифра.
[code python][/code]
Офлайн
> точка не цифра.
Да, но 123.15 является числом. По этому я не рекомендовал бы пользоваться этими методами.
Офлайн
ну так естевенно что проверять нужно на то на что нужно Если нужно на цифры то на цифры, если на числа то на числа. Топикстартер говорит что должны быть “данные которые имеют только цифры”. для этого isdigit() вполне подходит.
[code python][/code]
Офлайн
> Топикстартер говорит что должны быть “данные которые имеют только цифры”
Часто топикстартеры не знают чем числа отличатся от цифр.
Офлайн
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)
>>> 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)
>>> 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 >>>
Отредактировано py.user.next (Март 30, 2021 21:31:32)
Офлайн
Rodegastну зато потом их ждет “просветление”
Часто топикстартеры не знают чем числа отличатся от цифр.
[code python][/code]
Офлайн
> Принцип работы
Это ещё один пример того как делать не нужно. Ибо Простое лучше, чем сложное. и Сложное лучше, чем запутанное..
Офлайн