Уведомления

Группа в Telegram: @pythonsu

#1 Март 18, 2015 01:16:54

sovuschka
Зарегистрирован: 2015-03-16
Сообщения: 32
Репутация: +  0  -
Профиль   Отправить e-mail  

преобразование строки ASCI в число

получаю ответ от устройства в кодах ASCI а работать нужно с числом, получаемым
y = b'81050026:\r\n' # это приходит,
print(y) # печатаю, то, с чем работать
>>>
b'81050026'

а мне нужно получить это в числовом виде, а не байтовой строкой.

Как преобразовать ?? подскажите пожалуйста

Отредактировано sovuschka (Март 18, 2015 10:03:20)

Офлайн

#2 Март 18, 2015 01:46:45

terabayt
От: Киев
Зарегистрирован: 2011-11-26
Сообщения: 1099
Репутация: +  103  -
Профиль   Отправить e-mail  

преобразование строки ASCI в число

ну учитывая двоеточие что стоит после числа

>>> y = b'81050026:\r\n'
>>> a = int(y.rstrip()[:-1])
>>> a
81050026



————————————————
-*- Simple is better than complex -*-

Офлайн

#3 Март 18, 2015 10:06:32

sovuschka
Зарегистрирован: 2015-03-16
Сообщения: 32
Репутация: +  0  -
Профиль   Отправить e-mail  

преобразование строки ASCI в число

Все работало пока не пришел вот такой код…
>>> y = b'- 254:\r\n' # – между знаком ‘-’ и числом ‘254’ пробелы в количестве 4 штук, редактор форума сокращает

Отредактировано sovuschka (Март 18, 2015 10:10:00)

Офлайн

#4 Март 18, 2015 11:38:46

JOHN_16
От: Россия, Петропавловск-Камчатск
Зарегистрирован: 2010-03-22
Сообщения: 3292
Репутация: +  221  -
Профиль   Отправить e-mail  

преобразование строки ASCI в число

Можно воспользоваться регулярными выражениями, что бы искать в строке только допустимые символы. Вот небольшой тестовый пример , но регулярное выражение наверняка можно лучше написать, более универсальное.

>>> import re
>>> s='81050026:\r\n'
>>> int(''.join(re.findall('(?:[-\d])', s)))
81050026
>>> s='- 254:\r\n'
>>> int(''.join(re.findall('(?:[-\d])', s)))
-254



_________________________________________________________________________________
полезный блог о python john16blog.blogspot.com

Офлайн

#5 Март 18, 2015 22:38:44

sovuschka
Зарегистрирован: 2015-03-16
Сообщения: 32
Репутация: +  0  -
Профиль   Отправить e-mail  

преобразование строки ASCI в число

дело в том, что у меня приходит
y = b'81050026:\r\n'
это байтовая строка и если я сделаю

>>> import re
>>> s=b'81050026:\r\n'
>>> int(''.join(re.findall('(?', s)))
Traceback (most recent call last):
File “<pyshell#11>”, line 1, in <module>
int(''.join(re.findall('(?', s)))
File “C:\Python34\lib\re.py”, line 210, in findall
return _compile(pattern, flags).findall(string)
TypeError: can't use a string pattern on a bytes-like object

Офлайн

#6 Март 18, 2015 22:46:27

JOHN_16
От: Россия, Петропавловск-Камчатск
Зарегистрирован: 2010-03-22
Сообщения: 3292
Репутация: +  221  -
Профиль   Отправить e-mail  

преобразование строки ASCI в число

Переведите ее из байтов в строку:

>>> import re
>>>
>>> s=b'81050026:\r\n'
>>> s=s.decode()
>>>
>>> int(''.join(re.findall('(?:[-\d])', s)))
81050026
>>>
>>> type(s)
<class 'str'>
>>>



_________________________________________________________________________________
полезный блог о python john16blog.blogspot.com

Офлайн

#7 Март 18, 2015 23:32:16

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

преобразование строки ASCI в число

JOHN_16
re.findall('(?:[-\d])', s)
А зачем там (?: … ) ? Чтобы он вернул список строк, а не кортежей?

>>> import re
>>> 
>>> re.findall(r'[ab]', 'abcabcabc')
['a', 'b', 'a', 'b', 'a', 'b']
>>>

JOHN_16
Переведите ее из байтов в строку:
Можно не переводить, re поддерживает работу с байтовыми объектами.

>>> import re
>>> 
>>> re.findall(br'[ab]', b'abcabcabc')
[b'a', b'b', b'a', b'b', b'a', b'b']
>>>

sovuschka
получаю ответ от устройства в кодах ASCI а работать нужно с числом
Сделай функцию очистки от ненужных символов. То есть получил, почистил, превратил в число, применил.
А на чём она там будет базироваться, на re или не на re - это неважно.



Отредактировано py.user.next (Март 18, 2015 23:36:13)

Офлайн

#8 Март 19, 2015 04:51:33

JOHN_16
От: Россия, Петропавловск-Камчатск
Зарегистрирован: 2010-03-22
Сообщения: 3292
Репутация: +  221  -
Профиль   Отправить e-mail  

преобразование строки ASCI в число

py.user.next
А зачем там (?: … ) ? Чтобы он вернул список строк, а не кортежей?
я почти ноль в регулярках :) не шутка. Не даются мне они, если что то и делается то со скрипом и болью



_________________________________________________________________________________
полезный блог о python john16blog.blogspot.com

Офлайн

#9 Март 19, 2015 06:31:30

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

преобразование строки ASCI в число

JOHN_16
Не даются мне они, если что то и делается то со скрипом и болью
Эта ошибка (лишняя незахватывающая группа) с регулярными выражениями не связана. Нужно разделять регулярные выражения и функции, которые их принимают. В частности, здесь пробел в понимании поведения функции re.findall(), а не того, как устроено регулярное выражение.

Сам изучал регекспы по документации к третьему python.org. re
Если бы ты это читал, то в описании к \d увидел бы
\d
For Unicode (str) patterns:
Matches any Unicode decimal digit (that is, any character in Unicode character category [Nd]). This includes [0-9], and also many other digit characters. If the ASCII flag is used only [0-9] is matched (but the flag affects the entire regular expression, so in such cases using an explicit [0-9] may be a better choice).
For 8-bit (bytes) patterns:
Matches any decimal digit; this is equivalent to [0-9].
что там есть два вида шаблонов - юникодовые и байтовые.

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



Отредактировано py.user.next (Март 19, 2015 06:44:52)

Офлайн

#10 Март 20, 2015 14:34:05

sovuschka
Зарегистрирован: 2015-03-16
Сообщения: 32
Репутация: +  0  -
Профиль   Отправить e-mail  

преобразование строки ASCI в число

py.user.next
Так и сделал…

Офлайн

Board footer

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

Powered by DjangoBB

Lo-Fi Version