фильтровать входную строку в массиве python - PullRequest
0 голосов
/ 13 июня 2018

Я пытаюсь создать массив из следующей строки:

'25\r\n35\r\n5\r\n15\r\n25\r\n35\r\n5\r\n15\r\n25\r\n35\r\n5\r\n15\r\n25\r\n35\r\n5\r\n15\r\n25\r\n35\r\n5\r\n15\r\n25\r\n35\r\n5\r\n15\r\n25\r\n35\r\n5\r\n15\r\n25\r\n35\r\n5\r\n15\r\n25\r\n'

Где необходимо добавить только цифры.

Я пробовал следующее:

MyString.decode().strip('\r\n')

Но тогда я просто удалил '\ r \ n'

Вопрос: есть ли способ фильтрациитолько на числа и положить его в массив?

РЕДАКТИРОВАТЬ:

array = [int(x) for x in data.split('\r\n')]

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

Я работаю с Bluetooth и пытаюсь прочитать выходной поток.

вот мой код:

    def bluetooth_connect(self):
    bd_addr = "98:D3:31:FB:14:C8"   # MAC-address of our bluetooth-module
    port = 1
    sock = bluetooth.BluetoothSocket(bluetooth.RFCOMM)
    sock.connect((bd_addr, port))

    data = ""
    while 1:
        try:
            data += sock.recv(1024)
            data_end = data.find('\n')
            array = []

            if data_end != -1:
                self.move_all_servos(data)
                data = data[data_end + 1:]
                array = [int(x) for x in data.split('\r\n')]

                for i in range(0, leng(array)):
                     print(i)

        except KeyboardInterrupt:
            break
    sock.close()

сначала я получаю правильный массив, но посленекоторое время он вылетает с этой ошибкой:

array = [int(x) for x in data.split('\r\n')] ValueError: invalid literal for int() with base 10: ''

Ответы [ 2 ]

0 голосов
/ 13 июня 2018

Проблема с [int(x) for x in data.split('\r\n')] состоит в том, что результат будет содержать пустую строку '' в конце, после последнего \r\n.Вы можете использовать условие фильтра, чтобы удалить его ...

>>> [int(x) for x in data.split('\r\n') if x]
[25, 35, 5, 15, 25, 35, 5, 15, 25, 35, 5, 15, 25, 35, 5, 15, 25, 35, 5, 15, 25, 35, 5, 15, 25, 35, 5, 15, 25, 35, 5, 15, 25]

... или просто использовать data.split() без параметра:

>>> [int(x) for x in data.split()]
[25, 35, 5, 15, 25, 35, 5, 15, 25, 35, 5, 15, 25, 35, 5, 15, 25, 35, 5, 15, 25, 35, 5, 15, 25, 35, 5, 15, 25, 35, 5, 15, 25]

Из документации (выделено мое):

S.split(sep=None, maxsplit=-1) -> list of strings

Возвращает список слов в S, используя sep в качестве строки-разделителя.Если задан maxsplit, то делится не более maxsplit. Если sep не указан или Нет, любая строка пробела является разделителем и пустые строки удаляются из результата .

0 голосов
/ 13 июня 2018

Использовать сплит.

s = '25\r\n35\r\n5\r\n15\r\n25\r\n35\r\n5\r\n15\r\n25\r\n35\r\n5\r\n15\r\n25\r\n35\r\n5\r\n15\r\n25\r\n35\r\n5\r\n15\r\n25\r\n35\r\n5\r\n15\r\n25\r\n35\r\n5\r\n15\r\n25\r\n35\r\n5\r\n15\r\n25\r\n'
s.split('\r\n')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...