Уведомления

Группа в Telegram: @pythonsu

#1 Авг. 23, 2015 18:24:35

Iskatel
Зарегистрирован: 2015-07-29
Сообщения: 291
Репутация: +  3  -
Профиль   Отправить e-mail  

Генерация списка словарей из текстового файла

Ну и где тут сплит по тире?
До меня не доходит, что Вы имеете ввиду

Офлайн

#2 Авг. 23, 2015 18:41:07

Shaman
Зарегистрирован: 2013-03-15
Сообщения: 1369
Репутация: +  88  -
Профиль   Отправить e-mail  

Генерация списка словарей из текстового файла

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

Офлайн

#3 Авг. 23, 2015 18:52:51

Iskatel
Зарегистрирован: 2015-07-29
Сообщения: 291
Репутация: +  3  -
Профиль   Отправить e-mail  

Генерация списка словарей из текстового файла

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

А зачем? алгоритм и так проще некуда - встретив тире берем следующие три строчки и выбираем в них числа

Я вообще все это написал т.к. ТС жаловался на скорость. у него 45 сек на 500 кб. Я копипастом сделал файл на 3,5 мб (24600 блоков) - четверть секунды (тоже i7)

Регексп очень прожорливая штука

Офлайн

#4 Авг. 23, 2015 18:58:34

Shaman
Зарегистрирован: 2013-03-15
Сообщения: 1369
Репутация: +  88  -
Профиль   Отправить e-mail  

Генерация списка словарей из текстового файла

Iskatel
А зачем?
Больше для “поговорить”

Офлайн

#5 Авг. 23, 2015 19:17:15

Iskatel
Зарегистрирован: 2015-07-29
Сообщения: 291
Репутация: +  3  -
Профиль   Отправить e-mail  

Генерация списка словарей из текстового файла

Хотя вру, попробовал вариант с регекспом - даже быстрее раза в 1,5.

Но я всеже за автоматы - проще навтыкать проверок для валидации данных и т.п. Как раз во “всяких случаях” эксцепшны кидать.

Офлайн

#6 Авг. 23, 2015 21:17:13

Iskatel
Зарегистрирован: 2015-07-29
Сообщения: 291
Репутация: +  3  -
Профиль   Отправить e-mail  

Генерация списка словарей из текстового файла

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})

Зы. а насчет варианта с регекспами - профилировщик показывает, что больше всего времени жрет zip (в два раза больше чем регексп)

Офлайн

#7 Авг. 23, 2015 21:27:37

Iskatel
Зарегистрирован: 2015-07-29
Сообщения: 291
Репутация: +  3  -
Профиль   Отправить e-mail  

Генерация списка словарей из текстового файла

UPD: мой крайний вариант и регексп (при редактировании не дает делать вложения)
Это на том файле в 24600 блоков

Отредактировано Iskatel (Авг. 23, 2015 21:29:17)

Прикреплённый файлы:
attachment 2.png (24,4 KБ)

Офлайн

#8 Авг. 23, 2015 22:36:19

metotron
Зарегистрирован: 2015-08-20
Сообщения: 30
Репутация: +  0  -
Профиль   Отправить e-mail  

Генерация списка словарей из текстового файла

не думал что моя скромная задачка породит 5 страниц :-) спасибо большое всем, кто предложил свой вариант. Я пока остановлюсь на варианте с регэкспами, так как он кажется более гибким. Надеюсь в будущем все-таки добраться до источника генерации файла и поправить алгоритм, чтобы не пришлось его жестко парсить.
Но передо мной встала еще одна задача (честно не хотел ее сразу писать так как пытался сам решить)
После получения словаря, я вытаскиваю оттуда значения в отдельный лист и на основе него строю график
в Bokeh (нравится эта тулза за красивые графики)
И мне по Х надо бы иметь накопленное время в секундах. По сути на вход подаются X и Y листы.
Каждый блок текста начинается у меня с указания времени. и по хорошему мне нужно в имент в словарике это распарсенное время. Чтобы потом в лист добавить начальный элемент “0” и потом сумму секунд от этого “0” (0 это время первого блока)
Соответственно встает вопрос распарсивания этого времени и превращения его в какое-то значение, которые бы в себе содержало одним числом время (я не помню как это значение называется), чтобы потом его “накапливать”
Т.е я планирую написать что то типа “если лист TIME пуст то первое значение = 0, второе и дальше =”кол-во секунд с первой записи"
Не подскажите как правильно парсить и конвертировать это? Или куда лучше посмотреть что бы найти решение
Спасибо

Офлайн

#9 Авг. 23, 2015 22:47:42

Iskatel
Зарегистрирован: 2015-07-29
Сообщения: 291
Репутация: +  3  -
Профиль   Отправить e-mail  

Генерация списка словарей из текстового файла

Парсить гдето также как и раньше, только еще и строчку со временем
Хранить и обрабатывать удобно в UNIX-Time https://ru.wikipedia.org/wiki/UNIX-время
А конвертировать - модулем time, по формату

ЗЫ. ссылку скопировать и вставить в браузер, форум ее както странно преобразовал (не нажимать )

Отредактировано Iskatel (Авг. 23, 2015 22:50:17)

Офлайн

#10 Авг. 23, 2015 23:26:36

Iskatel
Зарегистрирован: 2015-07-29
Сообщения: 291
Репутация: +  3  -
Профиль   Отправить e-mail  

Генерация списка словарей из текстового файла

Вот код:

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})

Вот это гибкость. а регексп загника…

Офлайн

Board footer

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

Powered by DjangoBB

Lo-Fi Version