Найти - Пользователи
Полная версия: Парсинг файлов конфигов.
Начало » Python для новичков » Парсинг файлов конфигов.
1 2
hram.py
Доброго времени суток, третий день бьюсь с конфиг файлами dxdiag.txt
Из них нужно извлекать необходимые данные, в моем случае по процам.
Что я смог сделать:

Processor: AMD Athlon™ 64 X2 Dual Core Processor 5400+ (2 CPUs), ~2.8GHz
Processor: Intel(R) Core(TM) i5 CPU 750 @ 2.67GHz (4 CPUs)
Processor: AMD Athlon™ 64 X2 Dual Core Processor 5600+ (2 CPUs), ~2.8GHz
Video Processor:
Processor: Intel(R) Core(TM)2 Quad CPU Q6600 @ 2.40GHz (4 CPUs)
Processor: AMD Athlon™ 64 X2 Dual Core Processor 3600+, MMX, 3DNow (2 CPUs), ~2.0GHz
Processor: Intel(R) Pentium(R) Dual CPU E2180 @ 2.00GHz (2 CPUs)

Загвоздка на данном этапе- проскакивают не нужные строки, при совпадении с заданным словом для поиска нужной строки и записи в другой файл.
   for line in f:
if "Processor:" in line:
f = open(r"c:\proc.txt", 'a')
f.writelines(line)
f.close()
f.close()
Но в итоге нужно получить статистику
1 По производителям
AMD, Intel, Другие
2 по количеству ядер
1х, 2х, 3х, 4х
Больше
3 по частотам - градации по частотам в своей группе по количеству ядер
———-
Делать ли это через регулярные выражения?
И как в итоге ограничить искомую строку по слову, но с учетом возможных совпадений..
py.user.next
два раза закрываешь файл ?
используй with

приведи пример исходных данных и статистики для них
(что за “Video Processor” ? )
hram.py
два раза закрываю, первый раз закрываю тот куда пишу, а второй клоз - для открытого ранее файла, просто мне нужно за один раз пробегать 1000 файлов. таких..
“Video Processor: ” - данная строка “паразит” то есть, то ее нет.. и мне нужно ее игнорировать, но мой код ее принимает за нужную и кидает до кучи.
вот часть исходника - они однотипны. и там где то по 700 строк лишней инфы =)
——————
System Information
——————
Time of this report: 10/16/2011, 12:12:49
Machine name: MICROSOF-E89347
Operating System: Windows XP Professional (5.1, Build 2600) Service Pack 3 (2600.xpsp_sp3_qfe.090206-1316)
Language: Russian (Regional Setting: Russian)
System Manufacturer: System manufacturer
System Model: System Product Name
BIOS: BIOS Date: 11/11/09 17:35:14 Ver: 08.00.15
Processor: Intel(R) Core(TM) i7 CPU 930 @ 2.80GHz (8 CPUs)
Memory: 3064MB RAM
Page File: 561MB used, 4385MB available
Windows Dir: C:\WINDOWS
DirectX Version: DirectX 9.0c (4.09.0000.0904)
DX Setup Parameters: Not found
DxDiag Version: 5.03.2600.5512 32bit Unicode

Вот весь код, что пока сваял и оно работает =)
# читает файлы из заданной директории, копирую необходимую строку в заданный файл
import os
x= r'C:\test\'
for filename in os.listdir(x): #перебирает все файлы в директории Х
a = x + filename # складываем имя файла и его адрес для последующей работы
f = open(a, 'r') # открываем последовательно файлы по ранее полученному адресу
for line in f:
if " Processor:" in line: #!!!!пара пробелов временное решение. да бы исключить появление строк где перед процессором стоит другое слово.. Работает только благодаря наличию нескольких пробелов перед нужным словом в исходнике..
f = open(r'c:\proc.txt', 'a') # открывает файл с параметром - добавления инфы в конец файла
f.writelines(line) # запись в заданный файл прочтенной строки
f.close()
f.close()
В Python'е третий день, дали задание оптимизировать процесс сбора статистики… А 1000и файлов перебирать ручками. .сами понимаете..

Спасибо , что пытаетесь вникнуть и помоч! =)
sp3
import os
x= r'C:\test\'
data = []
for filename in os.listdir(x): #перебирает все файлы в директории Х
a = x + filename # складываем имя файла и его адрес для последующей работы
f = open(a) # открываем последовательно файлы по ранее полученному адресу
for line in f:
if line.startswith("Processor:"):
data.append(line)

f.close()

fout = open(r'c:\proc.txt', 'a')
for line in data:
fout.write(line)
fout.close()
hram.py
Попробую, благодарю. По результатам отпишусь =)
hram.py
Да, так действительно лучше. Спасибо.
Как бы теперь их сгруппировать? хотя бы по амд интел и другие… По рекомендуете способ?
Я думаю использовать шаблон, причем хочется максимально универсальный.., но вот рассматривая списки.. Пока получается чуть ли не по именно прописывать ( а там разновидностей очень много у каждого) и в итоге искать и складывать в группы…
py.user.next
hram.py
два раза закрываю, первый раз закрываю тот куда пишу, а второй клоз - для открытого ранее файла
это ошибка, второй файл закрывается, а первый теряется (выведи f.closed после цикла и увидишь)
их нужно по-разному называть

hram.py
и мне нужно ее игнорировать, но мой код ее принимает за нужную
перед проверкой нужно сделать .lstrip() и проверять через .startswith()

hram.py
Как бы теперь их сгруппировать? хотя бы по амд интел
в отфильтрованном файле нужно иметь строки без префикса “Processor: ” и white space символов по краям
для определения фирмы:
parts = line.split()
firm = parts[0]
дальше по названию фирмы определяешь дальнейший разбор
hram.py
sp3 - Спасибо.
py.user.next - да, верно, уже позже я понял, что был там не прав и даже - просто глупо было так писать) Попробую сегодня ваши предложения. Спасибо.
hram.py
Доброго дня.. В общем снова спасибо за помощ=) с теми штуками я разобрался) Научился считать, выводить, искать нужное) даже вроде оптимальными методами) если так можно выразиться. В общем я в восторге от этого процесса.
Теперь есть вот такое задание, продолжение того что сделано, но посложнее чтоли..-
Есть список, приведу его ниже, это уже итоговый результат моей деятельности =)
две колонки: CPU и frequency.
Количество 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

Очень хочется видоизменить етот список до следующего вида или близкого к нему:
Количество CPU : 1 = 4шт,
frequency: “2.6GHz” = 1
frequency: “2.7GHz” = 2
frequency: “2.8GHz” = 1
Количество CPU : 2 = 6шт,
frequency: “1GHz” = 6

Есть идеи как это реализовать?
В теории такой вариант есть..
1. делаем словарь, ключ - строка, значение - число
2. берём строку, проверяем входит ли она в словарь
3. если входит - берём значение счётчика из словаря (ключ - текущая строка) и увеличиваем на 1
4. если не входит - заносим строку в словарь со значением счетчика 1
—–
Выслушаю ваши предложения, будут примеры, с удовольствием посмотрю.
“само собой как ето вывести уже в файл, в нужном виде я знаю =) вопрос технологии процесса получения этих данных=)”
s0rg
TEST = 'Количество CPU = 1, frequency = 2.6 GHz\n\
Количество CPU = 1, frequency = 2.7 GHz\n\
Количество CPU = 1, frequency = 2.7 GHz\n\
Количество CPU = 1, frequency = 2.8 GHz\n\
Количество CPU = 2, frequency = 1.0 GHz\n\
Количество CPU = 2, frequency = 1.0 GHz\n\
Количество CPU = 2, frequency = 1.0 GHz\n\
Количество CPU = 2, frequency = 1.0 GHz\n\
Количество CPU = 2, frequency = 1.0 GHz\n\
Количество CPU = 2, frequency = 1.0 GHz'

cpu_stat = dict()

for ln in TEST.split('\n'):
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

for k,v in cpu_stat.iteritems():
print 'CPU Num: %s' % k
for k1,v1 in v.iteritems():
print 'Freq: %s count: %d' % (k1, v1)
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