Форум сайта python.su
Ну и где тут сплит по тире?
До меня не доходит, что Вы имеете ввиду
Офлайн
IskatelМожно или упростить алгоритм за счет большего поедания ресурсов на сплитах, или отказаться от сплитов в пользу других средств. А ваш текущий вариант скорей компромиссный.
До меня не доходит, что Вы имеете ввиду
Офлайн
Shaman
Можно или упростить алгоритм за счет большего поедания ресурсов на сплитах, или отказаться от сплитов в пользу других средств. А ваш текущий вариант скорей компромиссный.
Офлайн
IskatelБольше для “поговорить”
А зачем?
Офлайн
Хотя вру, попробовал вариант с регекспом - даже быстрее раза в 1,5.
Но я всеже за автоматы - проще навтыкать проверок для валидации данных и т.п. Как раз во “всяких случаях” эксцепшны кидать.
Офлайн
2Shaman Правда Ваша, если вывод статичный, зачем вообще эти сплиты
out =[] pos = -1 with open('d:\\info.txt') as f: for line in f: if line[0] == '-': pos = 0 elif pos == 0: mt = int(line[9:24]) pos = 1 elif pos == 1: mf = int(line[9:24]) pos = 2 elif pos == 2: buf = int(line[9:24]) pos = -1 out.append({'MemTotal':mt,'MemFree':mf,'Buffers':buf})
Офлайн
UPD: мой крайний вариант и регексп (при редактировании не дает делать вложения)
Это на том файле в 24600 блоков
Отредактировано Iskatel (Авг. 23, 2015 21:29:17)
Прикреплённый файлы: 2.png (24,4 KБ)
Офлайн
не думал что моя скромная задачка породит 5 страниц :-) спасибо большое всем, кто предложил свой вариант. Я пока остановлюсь на варианте с регэкспами, так как он кажется более гибким. Надеюсь в будущем все-таки добраться до источника генерации файла и поправить алгоритм, чтобы не пришлось его жестко парсить.
Но передо мной встала еще одна задача (честно не хотел ее сразу писать так как пытался сам решить)
После получения словаря, я вытаскиваю оттуда значения в отдельный лист и на основе него строю график
в Bokeh (нравится эта тулза за красивые графики)
И мне по Х надо бы иметь накопленное время в секундах. По сути на вход подаются X и Y листы.
Каждый блок текста начинается у меня с указания времени. и по хорошему мне нужно в имент в словарике это распарсенное время. Чтобы потом в лист добавить начальный элемент “0” и потом сумму секунд от этого “0” (0 это время первого блока)
Соответственно встает вопрос распарсивания этого времени и превращения его в какое-то значение, которые бы в себе содержало одним числом время (я не помню как это значение называется), чтобы потом его “накапливать”
Т.е я планирую написать что то типа “если лист TIME пуст то первое значение = 0, второе и дальше =”кол-во секунд с первой записи"
Не подскажите как правильно парсить и конвертировать это? Или куда лучше посмотреть что бы найти решение
Спасибо
Офлайн
Парсить гдето также как и раньше, только еще и строчку со временем
Хранить и обрабатывать удобно в UNIX-Time https://ru.wikipedia.org/wiki/UNIX-время
А конвертировать - модулем time, по формату
ЗЫ. ссылку скопировать и вставить в браузер, форум ее както странно преобразовал (не нажимать )
Отредактировано Iskatel (Авг. 23, 2015 22:50:17)
Офлайн
Вот код:
import time out =[] pos = -1 with open('d:\\info.txt') as f: for line in f: if line[0] == '-': s = ':'.join(line.split(':')[0:3]) # костыль, тайм меньше секунды не кушает tm = time.mktime(time.strptime(s,'---%Y-%m-%d %H:%M:%S')) pos = 0 elif pos == 0: mt = int(line[9:24]) pos = 1 elif pos == 1: mf = int(line[9:24]) pos = 2 elif pos == 2: buf = int(line[9:24]) pos = -1 out.append({'Time':tm,'MemTotal':mt,'MemFree':mf,'Buffers':buf})
Офлайн