Найти - Пользователи
Полная версия: Парсинг файлов конфигов.
Начало » Python для новичков » Парсинг файлов конфигов.
1 2
pyuser
from collections import Counter
from itertools import groupby
from operator import itemgetter

DATA = """
Количество CPU = 1, frequency = 2.6 GHz
Количество CPU = 1, frequency = 2.7 GHz
Количество CPU = 1, frequency = 2.7 GHz
Количество CPU = 1, frequency = 2.8 GHz
Количество CPU = 2, frequency = 1.0 GHz
Количество CPU = 2, frequency = 1.0 GHz
Количество CPU = 2, frequency = 1.0 GHz
Количество CPU = 2, frequency = 1.0 GHz
Количество CPU = 2, frequency = 1.0 GHz
Количество CPU = 2, frequency = 1.0 GHz
""".strip()

if "__main__" == __name__:
for cpu, freq in ((k, list(g)) for k, g in \
groupby(sorted(
l.split(",") for l in DATA.split("\n")),
key=itemgetter(0))):
print("{} = {} шт.".format(cpu.replace("=", ":"), len(freq)))
for k, v in Counter(x[1] for x in freq).items():
print("\t{} = {}".format(k.strip(), v))
python 2.7
hram.py
Спасибо, правда вот до смешного не могу перебороть ошибку:
for ln in TEST.split('\n'):
AttributeError: ‘list’ object has no attribute ‘split’

—-
возникает когда пытаюсь читать текст из файла. ..
к примеру так -
f = open ('c:\statistika1.txt')
TEST = f.readlines()
f.close()
—-
Если переводить в “str”,как требует сплит, напрмиер так test = str(TEST) - то полученный результат не верный..

—-
второй вариант сегодня посмотрю.. =) спасибо.
hram.py
Чтото я совсем запутался) Можно вас попросить прокоментировать Ваши коды…
s0rg
если у вас уже список то .split() не нужен - я привел пример для блока строк а не для списка.
hram.py
В процессе изучения ваших кодов =) разбираюсь.
hram.py
s0rg
Я под шаманил под себя ваш код, получилось следующее
f = open(r'c:\stat11.txt')

data = []
cpu_stat = dict()
for line in f:
line = "%s \n" %(line.strip (' \n'))
data.append(line)

f.close()

for ln in data:
words = ln.split(' ')
cpu = words[3].strip(',')
freq = words[6]
cpu_dict = cpu_stat.setdefault(cpu, {})
cpu_dict[freq] = cpu_dict.get(freq, 0) + 1

n=[]
z = []

for k,v in cpu_stat.iteritems():
z=[] #тут решил сделать так, как пока умею...
pk = 'CPU Num: %s \n' % k
n.append(pk)

for k1,v1 in v.iteritems():
pv = 'Freq: %s count: %d \n' % (k1, v1)
z.append(pv)
z.sort()
n.extend(z)

fout = open(r'c:\stat22.txt', 'a')
for ms in n:
fout.write(ms)

fout.close()
Вопрос почему когда список выглядит так :
Количество CPU = 1, frequency = 1.0 GHz
Количество CPU = 1, frequency = 2.7 GHz
Количество CPU = 1, frequency = 2.8 GHz
Количество CPU = 2, frequency = 2.0 GHz
Количество CPU = 2, frequency = 2.2 GHz
Количество CPU = 2, frequency = 2.6 GHz
Количество CPU = 2, frequency = 2.6 GHz
Количество CPU = 2, frequency = 3.1 GHz
Количество CPU = 2, frequency = 3.1 GHz
Количество CPU = 2, frequency = 3.1 GHz
Количество CPU = 2, frequency = 3.2 GHz
Количество CPU = 2, frequency = 3.2 GHz
Количество CPU = 2, frequency = 3.3 GHz
Количество CPU = 2, frequency = 3.5 GHz
Количество CPU = 3, frequency = 3.0 GHz
Количество CPU = 3, frequency = 3.0 GHz
Количество CPU = 3, frequency = 3.0 GHz
Количество CPU = 3, frequency = 3.0 GHz
Количество CPU = 3, frequency = 3.0 GHz
—-
добавилась строка с CPU = 3, он при обработке и выводе данных путает местами блоки CPU =2 с CPU =3, причем подсчеты выводит то верно к нужному значению нужные числа. Причем такая путанца происходит только с этими блоками. Проверял на других списках, и других значениях.
Выглядит ето так :
CPU Num: 1
Freq: 1.0 count: 1
Freq: 2.7 count: 1
Freq: 2.8 count: 1
CPU Num: 3
Freq: 3.0 count: 5
CPU Num: 2
Freq: 2.0 count: 1
Freq: 2.2 count: 1
Freq: 2.6 count: 2
Freq: 3.1 count: 3
Freq: 3.2 count: 2
Freq: 3.3 count: 1
Freq: 3.5 count: 1
——
Приму консультации и советы, с большим удовольствием и благодарностью!
s0rg
Словарь это НЕ сортированная последовательность, то что у вас сначала шел ‘CPU Num: 1’ а потом ‘CPU Num: 2’ это просто совпадение )
Если нужно получить отсортированный словарь то нужно делать так:
for k in sorted(cpu_stat.iterkeys()):
z=[] #тут решил сделать так, как пока умею...
pk = 'CPU Num: %s \n' % k
n.append(pk)

for k1,v1 in cpu_stat[k].iteritems():
pv = 'Freq: %s count: %d \n' % (k1, v1)
z.append(pv)
z.sort()
n.extend(z)
Еще не понятем мне сакральный смысл этой строки:
line = "%s \n" %(line.strip (' \n'))
hram.py
s0rg
Еще не понятем мне сакральный смысл этой строки:
line = "%s \n" %(line.strip (' \n'))

=) Да, это я баловался.. пока изучал вашу работу* .. и забыл убрать =) 0о не понимаю “что я хотел этим сказать”..
спасибо! О, понял - в общем почему то без этого извращения не работало) потом пока ее “придумал” совпали звезды, и заработало. а потом уже в результате обработок и передлок строку убрал и все работало без нее… =) жуть-жуткая.. )
pyuser
hram.py а почему Вы упорно не хотите воспользоваться решениями, которые предлагает сам Python? Вас пугают множественные импорты?
from collections import Counter
from itertools import groupby
from operator import itemgetter

with open(r"c:\stat11.txt", "r") as fin, open(r"c:\stat22.txt", "a") as fout:
pairs = ((x[3][:-1], x[6]) for x in (line.split() for line in fin))

for cpu_num, freq in ((k, Counter(x[1] for x in g)) for k, g in \
groupby(sorted(pairs), key=itemgetter(0))):
print("CPU num: {} count: {}".format(cpu_num, sum(freq.values())), file=fout)

for f, n in sorted(freq.items()):
print("\tFreq: {} count: {}".format(f, n), file=fout)
результат выглядит так:
CPU num: 1 count: 3
Freq: 1.0 count: 1
Freq: 2.7 count: 1
Freq: 2.8 count: 1
CPU num: 2 count: 11
Freq: 2.0 count: 1
Freq: 2.2 count: 1
Freq: 2.6 count: 2
Freq: 3.1 count: 3
Freq: 3.2 count: 2
Freq: 3.3 count: 1
Freq: 3.5 count: 1
CPU num: 3 count: 5
Freq: 3.0 count: 5
hram.py
Скажем так - на первый взгляд да пугают. Да и просто сроки поджимали, с первым вариантом легче было разобраться вот и применил его. А сейчас уже кошусь в сторону второго и думаю. на недельке разберу его и применю уже. )
Предложеный вами вариант мне очень нравится) Я в давние времена С++ занимался, а потом долгие годы вапще не было практики.. И сейчас когда приходится на python'е работать, не могу поверить “наверно” что можно вот так вот все это писать и делать =) Да и сроки .. А вот теперь да работа сдана, можно довести ее до ума разобраться получше. И сделать добротный инструмент. Спасибо, кстати вам обоим за помощ!
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