Уведомления

Группа в Telegram: @pythonsu

#1 Авг. 20, 2015 03:54:27

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

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

Привет! Нужна небольшая помощь
Дано - текстовый файл вида
—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

количество линий под датой всегда одинаково.
Необходимо на выходе получить список словарей вида:

[{'MemTotal:': 1386500, 'MemFree:': 176212, 'Buffers:':, 3900}, {'MemTotal:': 1386500, 'MemFree:': 176232, 'Buffers:':, 3908}]
Для чего нужно - потом я хочу найти максимальное и минимальное значение каждого ключа через
from operator import itemgetter
rows_min = min(rows, key = itemgetter('key'))
C причесыванием словаря (удаление пробелов и kB я разобрался. Остался вопрос как после каждой пустой строки и строки с timestemp создавать новый словарь и добавлять его в список
Код для “причесывания”
import re
dataset = {}
for line in open('somefile.txt'):
    line = re.sub("\s+", ' ', line).split(' ')
    line[1] = int(line[1])
    dataset[line[0]] = line[1]
Возможно не самый эффективный, но мой родной и мне понятный

Спасибо за помощь

Отредактировано metotron (Авг. 20, 2015 03:55:36)

Офлайн

#2 Авг. 20, 2015 04:20:10

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 9992
Репутация: +  857  -
Профиль   Отправить e-mail  

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

>>> import re
>>> 
>>> s = """
... —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
... """
>>> 
>>> pat = r"""MemTotal: (\d+) kB
... MemFree: (\d+) kB
... Buffers: (\d+) kB"""
>>> 
>>> lst = [dict(zip(('total', 'free', 'buffers'), i))
...        for i in re.findall(pat, s)]
>>> lst
[{'buffers': '3900', 'total': '1386500', 'free': '176212'}, {'buffers': '3908', 'total': '1386500', 'free': '176232'}]
>>>



Отредактировано py.user.next (Авг. 20, 2015 04:21:12)

Офлайн

#3 Авг. 20, 2015 06:53:56

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

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

спасибо! все работает, кроме одной маленькой засады - в строке между словом и цифрой более одного пробела Я попытался поменять паттерн - но положительного результата не получилось достигнуть

Отредактировано metotron (Авг. 20, 2015 06:54:21)

Офлайн

#4 Авг. 20, 2015 08:40:10

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 9992
Репутация: +  857  -
Профиль   Отправить e-mail  

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

metotron
в строке между словом и цифрой более одного пробела
>>> import re
>>> 
>>> s = """
... —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
... """
>>> 
>>> pat = r"""MemTotal: +(\d+) kB
... MemFree: +(\d+) kB
... Buffers: +(\d+) kB"""
>>> 
>>> lst = [dict(zip(('total', 'free', 'buffers'), i))
...        for i in re.findall(pat, s)]
>>> lst
[{'buffers': '3900', 'total': '1386500', 'free': '176212'}, {'buffers': '3908', 'total': '1386500', 'free': '176232'}]
>>>



Офлайн

#5 Авг. 20, 2015 08:49:55

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

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

спасибо! то, что нужно

Офлайн

#6 Авг. 20, 2015 21:05:20

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

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

все сломалось
я попытался читать текст из файла

def myRead():
    with open ("somefile.txt", "r") as myfile:
        data=myfile.read()
    return data
s = myRead()
но -
1/почему-то не корректно читает первые несколько строк
2/генерация словарика возвращает пустой список :-(

Офлайн

#7 Авг. 21, 2015 00:08:42

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 9992
Репутация: +  857  -
Профиль   Отправить e-mail  

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

metotron
я попытался читать текст из файла
Если питон третий, передай кодировку при открытии файла.

Приведи содержимое файла и полный код.



Офлайн

#8 Авг. 21, 2015 00:23:30

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

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

питон третий

import re
def myRead():
    with open ("somefile.txt", "r") as myfile:
        data=myfile.read()
    return data
s = myRead()
pat = r"""MemTotal: +(\d+) kB
    MemFree: +(\d+) kB
    Buffers: +(\d+) kB"""
lst = []
print(s)
for i in re.findall(pat, s):
    print(i)
    s = [int(x) for x in i]
    lst.append(dict(zip(('total', 'free', 'buffers'),s)));
print(lst)

сам исходный файл приаттачил

Прикреплённый файлы:
attachment repo.txt (936 байт)

Офлайн

#9 Авг. 21, 2015 00:24:52

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

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

я немного поменял код чтобы переделывать строку в число

Офлайн

#10 Авг. 21, 2015 00:49:44

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 9992
Репутация: +  857  -
Профиль   Отправить e-mail  

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

Так это же не текстовый файл, а rtf, там нет переводов строк.

Изначально-то было

metotron
Дано - текстовый файл вида
—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
А стало
{\rtf1\ansi\ansicpg1252\cocoartf1348\cocoasubrtf170
{\fonttbl\f0\fnil\fcharset0 Menlo-Regular;}
{\colortbl;\red255\green255\blue255;\red169\green183\blue198;\red43\green43\blue43;}
\margl1440\margr1440\vieww10800\viewh8400\viewkind0
\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural

\f0\fs24 \cf2 \cb3 ---2015-08-20 09:13:32:286105\uc0\u8232 MemTotal: 1386500 kB\u8232 MemFree: 181368 kB\u8232 Buffers: 7204 kB\u8232 \u8232 ---2015-08-20 09:13:36:168073\u8232 MemTotal: 1386500 kB\u8232 MemFree: 181648 kB\u8232 Buffers: 7204 kB\u8232 \u8232 ---2015-08-20 09:13:39:990420\u8232 MemTotal: 1386500 kB\u8232 MemFree: 181360 kB\u8232 Buffers: 7204 kB\u8232 \u8232 ---2015-08-20 09:45:00:174213\u8232 MemTotal: 1386500 kB\u8232 MemFree: 162708 kB\u8232 Buffers: 10680 kB\u8232 \
}

Так что сначала оттранслируй его в такую форму, которую изначально задал.



Отредактировано py.user.next (Авг. 21, 2015 00:54:11)

Офлайн

Board footer

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

Powered by DjangoBB

Lo-Fi Version