Найти - Пользователи
Полная версия: Генерация списка словарей из текстового файла
Начало » Python для новичков » Генерация списка словарей из текстового файла
1 2 3 4 5 6 7 8
Shaman
Iskatel
Конечные автоматы гораздо быстрее и надежнее
Хороший наброс! ) Это, конечно, обсуждаемо, но в текущей редакции делает не совсем то.
s = """
-2015-08-19 16:35:51:682031
musor1:  1386500 kB
musor2:  176212 kB   
musor3:  3900 kB
 
-2015-08-19 16:35:55:554202
MemTotal:  1386500 kB
MemFree:  176232 kB
Buffers:  3908 kB
"""
out =[]
pos = -1
 
for line in s.split('\n'):
    if not line:
        continue
    if line[0] == '-':
        pos = 0
    elif pos == 0:
        mt = int(line.split(':')[1].strip().split(' ')[0])
        pos = 1
    elif pos == 1:
        mf = int(line.split(':')[1].strip().split(' ')[0])
        pos = 2
    elif pos == 2:
        buf = int(line.split(':')[1].strip().split(' ')[0])
        pos = -1
        out.append({'MemTotal':mt,'MemFree':mf,'Buffers':buf})
 
print(out)
>>> 
[{'MemTotal': 1386500, 'MemFree': 176212, 'Buffers': 3900}, {'MemTotal': 1386500, 'MemFree': 176232, 'Buffers': 3908}]
>>> 
Iskatel
Про мусор я гдетото пропустил, в файле примера его нет… Или форумчане на всякий случай еще и искуственный интелект запилить хотят?

ЗЫ. как вы в коде делаете пустые строки? у меня тег “код” их выкидывает
Shaman
Iskatel
Про мусор я гдетото пропустил, в файле примера его нет
Про пустые строки тоже.
Iskatel
как вы в коде делаете пустые строки? у меня тег “код” их выкидывает
О, это тайное знание. Нужно руками пробелы в начале пустых строк добавить.
Iskatel
Shaman
Про пустые строки тоже.
Ну в моем варианте пустых строк то и нет, это вы строку посплитили, а при чтении из файла там честное ‘\n’ стоит

А насчет мусора - зачем решать задачу которой нет? Раз это вывод другой проги, то “внезапно” он появиться не может. Я так и не нашел упоминания о нем топикстартера, нашел только Ваше “лучше учесть все случаи” А тут уже непонятно, вроде ТС все случаи свои и описал, откуда другим то взяться? Впрочем ТС виднее…

Насчет вашего примера можно так:

elif pos == 0 and line.startswith('MemTotal')
#ну и так далее

Вот только это разговор ниочем - таких “всех случаев” можно напридумывать столько, что и впрямь только ИИ справится В исходных данных то этого нет…

ЗЫ. за тайное знание спасибо
Shaman
Iskatel
Раз это вывод другой проги, то “внезапно” он появиться не может.
О происхождении данных сказано мало. Судя по тому как в них внезапно смешались стили окончаний, они правятся вручную и могут иметь всякие неожиданности.
Если придерживаться теории о статичности формата, развейте идею на счет split('-').
Iskatel
Shaman
split('-')
Это, пардон, откуда?
Shaman
Iskatel
Это, пардон, откуда?
>>> """
-2015-08-19 16:35:51:682031
MemTotal:  1386500 kB
MemFree:  176212 kB   
Buffers:  3900 kB
 
-2015-08-19 16:35:55:554202
MemTotal:  1386500 kB
MemFree:  176232 kB
Buffers:  3908 kB
""".split('\n-')
['', '2015-08-19 16:35:51:682031\nMemTotal:  1386500 kB\nMemFree:  176212 kB   \nBuffers:  3900 kB\n', '2015-08-19 16:35:55:554202\nMemTotal:  1386500 kB\nMemFree:  176232 kB\nBuffers:  3908 kB\n']
>>> 
Iskatel
И внезапности в примере нет: дата и пустая строка всегда \n, данные всегда \r\n.
Вполне вероятно что данные выводит сторонний модуль, а программер, его использующий, добавил вывод даты и пустой строки, по привычке поставив \n
Iskatel
Shaman
развейте идею на счет split('-')
Тогда я совсем ничего не понимаю - у меня таких идей не возникало, что там развивать??
Shaman
Iskatel
у меня таких идей не возникало
А это
int(line.split(':')[1].strip().split(' ')[0])
?
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB