Найти - Пользователи
Полная версия: Генерация списка словарей из текстового файла
Начало » Python для новичков » Генерация списка словарей из текстового файла
1 2 3 4 5 6 7 8
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

количество линий под датой всегда одинаково.
Необходимо на выходе получить список словарей вида:
[{'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]
Возможно не самый эффективный, но мой родной и мне понятный

Спасибо за помощь
py.user.next
>>> 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'}]
>>>
metotron
спасибо! все работает, кроме одной маленькой засады - в строке между словом и цифрой более одного пробела Я попытался поменять паттерн - но положительного результата не получилось достигнуть
py.user.next
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'}]
>>>
metotron
спасибо! то, что нужно
metotron
все сломалось
я попытался читать текст из файла
def myRead():
    with open ("somefile.txt", "r") as myfile:
        data=myfile.read()
    return data
s = myRead()
но -
1/почему-то не корректно читает первые несколько строк
2/генерация словарика возвращает пустой список :-(
py.user.next
metotron
я попытался читать текст из файла
Если питон третий, передай кодировку при открытии файла.

Приведи содержимое файла и полный код.
metotron
питон третий
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)

сам исходный файл приаттачил
metotron
я немного поменял код чтобы переделывать строку в число
py.user.next
Так это же не текстовый файл, а 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 \
}

Так что сначала оттранслируй его в такую форму, которую изначально задал.
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