Уведомления

Группа в Telegram: @pythonsu

#1 Апрель 11, 2018 11:43:08

lupanton
Зарегистрирован: 2018-03-25
Сообщения: 17
Репутация: +  0  -
Профиль   Отправить e-mail  

Ввод данных циклом while...

Добра всем! Прибор, отмечает частоты магнитных колебаний у разных источников (ist1, ist2) и выдает данные в следующем виде:

 N #общее количество измерений
134 846 874 987 36749 55 90 54 .....# частоты у ист 1 - примерно 100 000 значений
ist1 #отсечка к другому источнику
34 89 76 65 78 98 678 ...... #частоты у ист 2 - примерно 100 000 значений
ist2 #отсечка к другому источнику
.
.
.
ist2 #последняя отсечка
quit #заканчиваются измерения
Количество циклов (частоты + отсечка) всегда разное, но всегда много - тысяч 5 примерно, плюс-минус.
Мне нужно через input() завести все в список вида:
 [{2 3 4 5....}, 'int1', {2 3 4 5....}, 'int2', ......., {2 3 4 5....}, 'int2']
Я это делаю так:
 n = int(input())
lst = []
a = set()
el = 0
while el != 'quit':
    el = input()
    lst.append({int(el) for el in el.split()})
    lst.append(input())
В результате, когда доходит дело до quit, то цикл не прекращается и пытается quit внести в lst как int:
 ValueError: invalid literal for int() with base 10: 'quit'

Где ошибка в организации цикла while…?

Офлайн

#2 Апрель 11, 2018 12:14:39

vic57
Зарегистрирован: 2015-07-07
Сообщения: 913
Репутация: +  127  -
Профиль  

Ввод данных циклом while...

 >>> l = []
>>> while True:
	s = input('?:')
	if not s: break
	l.append(int(s))
	
?:1
?:2
?:3
?:4
?:5
?:
>>> l
[1, 2, 3, 4, 5]
>>> 
просто нажми Enter

Офлайн

#3 Апрель 11, 2018 12:26:06

vic57
Зарегистрирован: 2015-07-07
Сообщения: 913
Репутация: +  127  -
Профиль  

Ввод данных циклом while...

lupanton
тысяч 5 примерно, плюс-минус.
Мне нужно через input() завести все в список вида:
именно через input()? 5000 значений - это сильно
а куда прибор пишет?
 >>> s = input()
1 2 3 4 5 6 quit
>>> [int(i) for i in s.split() if i.isdigit()]
[1, 2, 3, 4, 5, 6]
>>> 
можно таким способом

Отредактировано vic57 (Апрель 11, 2018 12:27:35)

Офлайн

#4 Апрель 11, 2018 19:14:05

lupanton
Зарегистрирован: 2018-03-25
Сообщения: 17
Репутация: +  0  -
Профиль   Отправить e-mail  

Ввод данных циклом while...

Это многоосевой миллигауссметр, собранный еще в 70-х годах прошлого века умельцами одного НИИ. Данные считываются в его собственную оперативную память, оттуда через com - порт в СУБД для систематизации и обработки. Фактически задача состоит в выхватывании частей потока для последующей поверки прибора - и желательно ее иметь в таком виде.
Спасибо, буду пробовать.

Офлайн

#5 Апрель 11, 2018 19:39:35

vic57
Зарегистрирован: 2015-07-07
Сообщения: 913
Репутация: +  127  -
Профиль  

Ввод данных циклом while...

lupanton
так и читайте прямо из порта или из БД, руками это набивать - пальцы сотрешь
+ обязательно ошибки оператора будут

Офлайн

#6 Апрель 13, 2018 09:09:20

lupanton
Зарегистрирован: 2018-03-25
Сообщения: 17
Репутация: +  0  -
Профиль   Отправить e-mail  

Ввод данных циклом while...

само собой! кто ж будет вручную это заводить-то, да и не получится. Замер на каждом источнике фиксирует данные в памяти прибора (оч древнее устройство, но настроенное и рабочее) - данные идут в СУБД, но их надо выхватить до записи новой порции данных в оперативку - получается они вроде как введены самим прибором во что-то наподобие текстового файла, нужно взять их -input() самый простой способ. Это временная заплатка до модернизации

Офлайн

#7 Апрель 13, 2018 11:24:32

Elaphe
Зарегистрирован: 2015-02-04
Сообщения: 125
Репутация: +  5  -
Профиль   Отправить e-mail  

Ввод данных циклом while...

Ошибка в том, что у вас проверка значения el происходит в начале цикла, затем ему присваивается новое значение, оно сплитится и приводится к int.
А когда вы доходите до последней строк, el у вас равен quit, проверка уже прошла. И вы его пробуете разбить на элементы и сделать из него int.
Правильно так:

  while True:
    el = input()
    if el == 'quit': break
  

Офлайн

#8 Апрель 13, 2018 11:49:04

vic57
Зарегистрирован: 2015-07-07
Сообщения: 913
Репутация: +  127  -
Профиль  

Ввод данных циклом while...

lupanton
но их надо выхватить до записи новой порции данных в оперативку - получается они вроде как введены самим прибором во что-то наподобие текстового файла, нужно взять их
1.ну технически легко запараллелить COM-порт на прием и сделать мониторинг в реальном времени
https://compress.ru/article.aspx?id=16512#%D0%9A%D0%BE%D0%BD%D1%82%D1%80%D0%BE%D0%BB%D1%8C%20%D0%BF%D0%BE%D1%81%D0%BB%D0%B5%D0%B4%D0%BE%D0%B2%D0%B0%D1%82%D0%B5%D0%BB%D1%8C%D0%BD%D0%BE%D0%B3%D0%BE%20%D0%BF%D0%BE%D1%80%D1%82%D0%B0%20%D0%BA%D0%BE%D0%BC%D0%BF%D1%8C%D1%8E%D1%82%D0%B5%D1%80%D0%B0%20(COM)

Офлайн

Board footer

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

Powered by DjangoBB

Lo-Fi Version