Форум сайта python.su
Доброго времени суток, третий день бьюсь с конфиг файлами 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()
Офлайн
два раза закрываешь файл ?
используй with
приведи пример исходных данных и статистики для них
(что за “Video Processor” ? )
Отредактировано (Ноя. 16, 2011 10:21:08)
Офлайн
два раза закрываю, первый раз закрываю тот куда пишу, а второй клоз - для открытого ранее файла, просто мне нужно за один раз пробегать 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()
Отредактировано (Ноя. 16, 2011 11:23:53)
Офлайн
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()
Офлайн
Попробую, благодарю. По результатам отпишусь =)
Офлайн
Да, так действительно лучше. Спасибо.
Как бы теперь их сгруппировать? хотя бы по амд интел и другие… По рекомендуете способ?
Я думаю использовать шаблон, причем хочется максимально универсальный.., но вот рассматривая списки.. Пока получается чуть ли не по именно прописывать ( а там разновидностей очень много у каждого) и в итоге искать и складывать в группы…
Отредактировано (Ноя. 16, 2011 16:33:32)
Офлайн
hram.pyэто ошибка, второй файл закрывается, а первый теряется (выведи f.closed после цикла и увидишь)
два раза закрываю, первый раз закрываю тот куда пишу, а второй клоз - для открытого ранее файла
hram.pyперед проверкой нужно сделать .lstrip() и проверять через .startswith()
и мне нужно ее игнорировать, но мой код ее принимает за нужную
hram.pyв отфильтрованном файле нужно иметь строки без префикса “Processor: ” и white space символов по краям
Как бы теперь их сгруппировать? хотя бы по амд интел
parts = line.split()
firm = parts[0]
Отредактировано (Ноя. 17, 2011 02:18:24)
Офлайн
sp3 - Спасибо.
py.user.next - да, верно, уже позже я понял, что был там не прав и даже - просто глупо было так писать) Попробую сегодня ваши предложения. Спасибо.
Офлайн
Доброго дня.. В общем снова спасибо за помощ=) с теми штуками я разобрался) Научился считать, выводить, искать нужное) даже вроде оптимальными методами) если так можно выразиться. В общем я в восторге от этого процесса.
Теперь есть вот такое задание, продолжение того что сделано, но посложнее чтоли..-
Есть список, приведу его ниже, это уже итоговый результат моей деятельности =)
две колонки: 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
—–
Выслушаю ваши предложения, будут примеры, с удовольствием посмотрю.
“само собой как ето вывести уже в файл, в нужном виде я знаю =) вопрос технологии процесса получения этих данных=)”
Отредактировано (Дек. 8, 2011 09:08:40)
Офлайн
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)
Офлайн