Форум сайта python.su
Привет! Нужна небольшая помощь
Дано - текстовый файл вида
—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'))
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)
Офлайн
>>> 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)
Офлайн
спасибо! все работает, кроме одной маленькой засады - в строке между словом и цифрой более одного пробела Я попытался поменять паттерн - но положительного результата не получилось достигнуть
Отредактировано metotron (Авг. 20, 2015 06:54:21)
Офлайн
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'}] >>>
Офлайн
спасибо! то, что нужно
Офлайн
все сломалось
я попытался читать текст из файла
def myRead(): with open ("somefile.txt", "r") as myfile: data=myfile.read() return data s = myRead()
Офлайн
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)
Прикреплённый файлы: repo.txt (936 байт)
Офлайн
я немного поменял код чтобы переделывать строку в число
Офлайн
Так это же не текстовый файл, а 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)
Офлайн