Уведомления

Группа в Telegram: @pythonsu

#1 Сен. 4, 2015 08:31:58

nax83
Зарегистрирован: 2015-09-03
Сообщения: 9
Репутация: +  0  -
Профиль   Отправить e-mail  

Проблема с кодом, нужна помощь

Добрый день!
имеется код, благодаря которому значению присваивается две строки, например:
11111111111
1111111
Но enumerate выдает номер строки нулевой для обеих, разбить с помощью split/strip и т.п. не может…
Нужна помощь)
Есть второй вариант решения-код сам работает, но данные выводятся сначала правильно с первой строкой (data), а далее вторая строка значений заменяет не то, что надо….. т.е. с первой строкой действия верные. вторая либо просто не выводится, либо выводится, но считается всё неверно….вывод напишу в конце…
В общих чертах - есть команда в ком. строке, которая выводит таблицу, данные из которой я вытягиваю. причем данные мне нужно вытягивать вне зависимости от количества строк с необходимыми данными. вот сама команда и ее вывод:

~ $ rados df
pool name KB objects clones degraded unfound rd rd KB wr wr KB
data 1204848704 21555277 0 0 0 139022 92444082 52700900 1550153369
metadata 41535 350387 0 0 0 1334312 3670751833 123883000 401565390
total used 4166216120 21905664
total avail 6217083240
total space 10939188688



вот сам код:

# -*- coding: utf-8 -*-
import os
import json
import re
import tempfile
import subprocess
import sys
import time
import fileinput
from sensu_plugin import SensuPluginMetricGraphite
from datetime import datetime
#class CephMetrics(SensuPluginMetricGraphite):
data = {
        'rd': 0,
        'rd KB': 0,
        'wr': 0,
        'wr KB': 0,
        'time':0
        }
work_data = {
        'rd': 0,
        'rd KB': 0,
        'wr': 0,
        'wr KB': 0,
        'time':0
        }
new_data = {
        'rd': 0,
        'rd KB': 0,
        'wr': 0,
        'wr KB': 0,
        'time':0
        }
#    def run(self):
#        mass_slovar = []
first_data = False
tmp_file = tempfile.gettempdir() + '/' + 'ceph.stats.tmp'
mode = 'r+' if os.path.exists(tmp_file) else 'w+'
prev_data_file = open(tmp_file, mode)
try:
    old_data = json.loads(''.join(prev_data_file.readlines()))
except ValueError:
    first_data = True
#old_data = work_data
old_time = old_data['time']
print ("old time", old_time)
atime = str(time.time())
now_time = ("%d" % (float(atime)))
print ("new time", now_time)
time_difference = (int(now_time) - int(old_time))
print ("time difference %d %s" %(time_difference, 'seconds'))
print ("\n")
c = subprocess.Popen("rados df".split(" "), stdout=subprocess.PIPE, stderr=subprocess.PIPE)
text = c.stdout.read()
for textline in text.split("\n"):
    stline = textline.strip()
    if len(stline) > 1 and not stline.startswith('pool') and not stline.startswith('total'):
        stline = re.split("\s+", stline)
#########где-то здесь должен быть более ровный код
######### текущему словарю new_data присваивается по два значения,которые мне по хорошему бы разбить и просуммировать/вычесть
        new_data = {
            'rd': stline[6],
            'rd KB': stline[7],
            'wr': stline[8],
            'wr KB': stline[9],
            'time': now_time
                    }
        print "\n"
        print new_data
   
        if not first_data:
            for k in work_data:
                try:
                    work_data[k] = (int(new_data[k]) - int(old_data[k]))
                except KeyError:
                    work_data[k] = 0
            #print ("new time", now_time)
            print ("\n")
            print ("old data", old_data)
            print ("\n")
            print ("new data", new_data)
            print ("\n")
            PoolName = stline[0]
            print ('PoolName: ',PoolName)
            for k in work_data:
                print ('   ' + k + '     ', work_data[k])
            print ("\n")
            readspeed = work_data['rd KB']
            writespeed = work_data['wr KB']
            readops = work_data['rd']
            writeops = work_data['wr']
            if work_data['rd KB'] > 0:
                print("average read speed for the last %d %s %d %s" %(time_difference, " seconds is ", ((readspeed / time_difference)), "bytes/s"))
                print("total %d %s %d %s" %(readops, "read operations for last ", time_difference, " seconds"))
                print("total %d %s" %((readops/time_difference), " read op/s"))
                print "%5.2f" % (readops/time_difference)
            else:
                print('no read operations for the last time')
            print ("\n")
            if (work_data['wr KB']) > 0:
                print("average write speed for the last %d %s %d %s" %(time_difference, " seconds is ", ((writespeed / time_difference)), "bytes/s"))
                print("total %d %s %d %s" %(writeops, "write operations for last ",time_difference, " seconds"))
                print("total ???? %d %s" %((writeops/time_difference), " write op/s"))
                print "%5.2f" % (writeops/time_difference)
            else:
                print('no write operations for the last time')
            #print "\n
prev_data_file.seek(0)
prev_data_file.write(json.dumps(new_data))
prev_data_file.truncate()
prev_data_file.close()


вот мой вывод:
/usr/bin/python2.7 /home/serg/PycharmProjects/untitled/234234234.py
('old time', u'1441344337')
('new time', ‘1441344625’)
time difference 288 seconds




{'rd': ‘139022’, ‘wr KB’: ‘1550153369’, ‘rd KB’: ‘92444082’, ‘wr’: ‘52700900’, ‘time’: ‘1441344625’}


('old data', {u'rd': u'1334312', u'wr KB': u'401565390', u'rd KB': u'3670751833', u'wr': u'123883000', u'time': u'1441344337'})


('new data', {'rd': ‘139022’, ‘wr KB’: ‘1550153369’, ‘rd KB’: ‘92444082’, ‘wr’: ‘52700900’, ‘time’: ‘1441344625’})


('PoolName: ‘, ’data')
(' rd ‘, -1195290)
(’ wr KB ‘, 1148587979)
(’ rd KB ‘, -3578307751)
(’ wr ‘, -71182100)
(’ time ‘, 288)


no read operations for the last time

###здесь у меня всякие проверки, особого внимания обращать не нужно
average write speed for the last 288 seconds is 3988152 bytes/s
total -71182100 write operations for last 288 seconds
total ???? -247161 write op/s
-247161.00


{’rd': ‘1334312’, ‘wr KB’: ‘401565390’, ‘rd KB’: ‘3670751833’, ‘wr’: ‘123883000’, ‘time’: ‘1441344625’}


('old data', {u'rd': u'1334312', u'wr KB': u'401565390', u'rd KB': u'3670751833', u'wr': u'123883000', u'time': u'1441344337'})


('new data', {'rd': ‘1334312’, ‘wr KB’: ‘401565390’, ‘rd KB’: ‘3670751833’, ‘wr’: ‘123883000’, ‘time’: ‘1441344625’})


('PoolName: ‘, ’metadata')
(' rd ‘, 0)
(’ wr KB ‘, 0)
(’ rd KB ‘, 0)
(’ wr ‘, 0)
(’ time ', 288)


no read operations for the last time


no write operations for the last time

Process finished with exit code 0

Отредактировано nax83 (Сен. 4, 2015 09:19:50)

Офлайн

#2 Сен. 4, 2015 11:59:34

sander
Зарегистрирован: 2015-02-19
Сообщения: 317
Репутация: +  53  -
Профиль   Отправить e-mail  

Проблема с кодом, нужна помощь

nax83
ужасное описание, ужасный код. удалите из кода все не нужное вроде

import fileinput
и
print ("\n")

Офлайн

#3 Сен. 4, 2015 13:14:37

nax83
Зарегистрирован: 2015-09-03
Сообщения: 9
Репутация: +  0  -
Профиль   Отправить e-mail  

Проблема с кодом, нужна помощь

# -*- coding: utf-8 -*-
import os
import json
import re
import tempfile
import subprocess
import time
data = {
    'rd': 0,
    'rd KB': 0,
    'wr': 0,
    'wr KB': 0,
    'time': 0
}
work_data = {
    'rd': 0,
    'rd KB': 0,
    'wr': 0,
    'wr KB': 0,
    'time': 0
}
new_data = {
    'rd': 0,
    'rd KB': 0,
    'wr': 0,
    'wr KB': 0,
    'time': 0
}
first_data = False
tmp_file = tempfile.gettempdir() + '/' + 'ceph.stats.tmp'
mode = 'r+' if os.path.exists(tmp_file) else 'w+'
prev_data_file = open(tmp_file, mode)
try:
    old_data = json.loads(''.join(prev_data_file.readlines()))
except ValueError:
    first_data = True
#old_data = data
old_time = old_data['time']
print ("old time", old_time)
atime = str(time.time())
now_time = ("%d" % (float(atime)))
print ("new time", now_time)
time_difference = (int(now_time) - int(old_time))
print ("time difference %d %s" % (time_difference, 'seconds'))
print ("\n")
c = subprocess.Popen("rados df".split(" "), stdout=subprocess.PIPE, stderr=subprocess.PIPE)
text = c.stdout.read()
for textline in text.split("\n"):
    stline = textline.strip()
    if len(stline) > 1 and not stline.startswith('pool') and not stline.startswith('total'):
        stline = re.split("\s+", stline)
        new_data = {
            'rd': stline[6],
            'rd KB': stline[7],
            'wr': stline[8],
            'wr KB': stline[9],
            'time': now_time
        }
        print ("old data", old_data)
        print ("new data", new_data)
        if not first_data:
            for k in work_data:
                try:
                    work_data[k] = (int(new_data[k]) - int(old_data[k]))
                except KeyError:
                    work_data[k] = 0
        PoolName = stline[0]
        print ('PoolName: ', PoolName)
        for k in work_data:
            print ('   ' + k + '     ', work_data[k])
prev_data_file.seek(0)
prev_data_file.write(json.dumps(new_data))
prev_data_file.truncate()
prev_data_file.close()
вот вывод:

('old time', u'1441361390')
('new time', ‘1441361503’)
time difference 113 seconds


('old data', {u'rd': u'1335042', u'wr KB': u'401578714', u'rd KB': u'3670752865', u'wr': u'123888135', u'time': u'1441361390'})
('new data', {'rd': ‘139022’, ‘wr KB’: ‘1550153369’, ‘rd KB’: ‘92444082’, ‘wr’: ‘52702653’, ‘time’: ‘1441361503’})
('PoolName: ‘, ’data')
(' rd ‘, -1196020)
(’ wr KB ‘, 1148574655)
(’ rd KB ‘, -3578308783)
(’ wr ‘, -71185482)
(’ time ‘, 113)
(’old data', {u'rd': u'1335042', u'wr KB': u'401578714', u'rd KB': u'3670752865', u'wr': u'123888135', u'time': u'1441361390'})
('new data', {'rd': ‘1335042’, ‘wr KB’: ‘401578714’, ‘rd KB’: ‘3670752865’, ‘wr’: ‘123888135’, ‘time’: ‘1441361503’})
('PoolName: ‘, ’metadata')
(' rd ‘, 0)
(’ wr KB ‘, 0)
(’ rd KB ‘, 0)
(’ wr ‘, 0)
(’ time ', 113)

по сути: второй вывод(где пул metadata) вообще не работает… Отчего я и задался целью поправить в самом начале, дабы той паре значений,присваиваемых одной переменной сделать присвоение двум, или просто их просуммировать-тогда и решение будет прозрачнее.
За кривость кода извиняюсь, я на начальном этапе освоения.

Отредактировано nax83 (Сен. 4, 2015 13:33:24)

Офлайн

#4 Сен. 4, 2015 13:55:43

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 9744
Репутация: +  843  -
Профиль   Отправить e-mail  

Проблема с кодом, нужна помощь

Саму задачу конкретно опиши без кода.



Офлайн

#5 Сен. 4, 2015 14:05:29

nax83
Зарегистрирован: 2015-09-03
Сообщения: 9
Репутация: +  0  -
Профиль   Отправить e-mail  

Проблема с кодом, нужна помощь

Есть команда консольная, которая выводит таблицу.
Мне нужно тело таблицы обрабатывать и из ее данных высчитывать скорость чтения/записи файлов.
Причем в теле таблицы может быть как два(сейчас), так и более пулов (сейчас-это data,metadata), поэтому я в коде делаю условие “если начало строки не содержит…..”
По итогу я пытаюсь присвоить словарю полученные данные из вырезки, однако получаемые данные верно вытянуть не получается.
как ни стараюсь-получаю значение присваиваемой переменной из двух строк(числа,которые между собой нужно будет просуммировать, или др.),эти числа я никак не могу разделить…


Есть идея каким-то массивом в конце выводить правильно получаемые данные, т.к. сейчас уже вижу частично работающую схему. Сейчас, т.к. одной переменной присвоено два значения, - вывод инфы делается дважды, где пытаются учавствовать все необходимые мне числа.
Бубна для танцев вокруг монитора с кодом нет, поэтому прошу помощи.

Офлайн

#6 Сен. 4, 2015 15:14:28

nax83
Зарегистрирован: 2015-09-03
Сообщения: 9
Репутация: +  0  -
Профиль   Отправить e-mail  

Проблема с кодом, нужна помощь

Попробую немного упростить понимание ситуации, постарался вырезать из кода отвлекающие внимание элементы:

# -*- coding: utf-8 -*-
import os
import subprocess
c = subprocess.Popen("rados df".split(" "), stdout=subprocess.PIPE, stderr=subprocess.PIPE)
text = c.stdout.read()
for textline in text.split("\n"):
    stline = textline.strip()
    if len(stline) > 1 and not stline.startswith('pool') and not stline.startswith('total'):
        stline = re.split("\s+", stline)
        print ("11111111111", stline[1].split())   #вот эта команда выводит злополучные две строки

Вот вывод:
('11111111111', скобочка 1204848704'])
('11111111111', скобочка' 45396'])

Если я смогу победить и каждому из чисел присвоить отдельные переменные-это можно считать победой, т.к. что делать дальше я знаю.


p.s. sander, спасибо, сейчас попробую!

Отредактировано nax83 (Сен. 4, 2015 15:24:31)

Офлайн

#7 Сен. 4, 2015 15:18:05

sander
Зарегистрирован: 2015-02-19
Сообщения: 317
Репутация: +  53  -
Профиль   Отправить e-mail  

Проблема с кодом, нужна помощь

nax83
если я правильно понял, то вот код, должно сработать
python3

import os
import json
import subprocess
import tempfile
def main(file_name="ceph.stats.tmp"):
    output = subprocess.check_output(["rados", "df"])
    # все столбцы таблицы, подставить правильные
    field_names = ['rd', 'rd KB', 'wr', 'wr KB', 'time']
    # названия, которые нужно игнорировать
    ignore_field_names = []
    file_path = os.path.join(tempfile.gettempdir(), file_name)
    if os.path.isfile(file_path):
        with open(file_path) as f:
            old_data = json.load(f)
    else:
        old_data = {}
        
    for line in output.splitlines()[1:-3]:
        splitted_line = line.split()
        pool_name = splitted_line[0]
        data = {
            name: int(value) for name, value in zip(field_names, splitted_line[1:])
            if name not in ignore_field_names
        }
        work_data = {}  # нам нужна work_data
        # здесь обновляются данные из old_data
        if old_data and pool_name in old_data:
            for key in data:
                work_data[key] = data[key] - old_data[pool_name][key]
                
                # old_data[pool_name][key] = ...
        else:
            old_data[pool_name] = data
    with open(file_path, "w") as f:
        json.dump(old_data, f)
if __name__ == "__main__":
    main()

Офлайн

#8 Сен. 4, 2015 15:31:33

nax83
Зарегистрирован: 2015-09-03
Сообщения: 9
Репутация: +  0  -
Профиль   Отправить e-mail  

Проблема с кодом, нужна помощь

sander, немного не понял на моменте с # old_data = …
вот как я отредактировал код, но он ничего не выводит…:

# -*- coding: utf-8 -*-
import os
import json
import subprocess
import tempfile
def main(file_name="ceph.stats.tmp"):
    output = subprocess.check_output(["rados", "df"])
    # все столбцы таблицы, подставить правильные
    field_names = ['rd', 'rd KB', 'wr', 'wr KB', 'time']
    # названия, которые нужно игнорировать
    ignore_field_names = ['KB', 'objects', 'clones', 'degrated', 'unfound']
    file_path = os.path.join(tempfile.gettempdir(), file_name)
    if os.path.isfile(file_path):
        with open(file_path) as f:
            old_data = json.load(f)
    else:
        old_data = {}
    for line in output.splitlines()[1:-3]:
        splitted_line = line.split()
        pool_name = splitted_line[0]
        data = {
            name: int(value) for name, value in zip(field_names, splitted_line[1:])
            if name not in ignore_field_names
        }
        work_data = {}  # нам нужна work_data
        # здесь обновляются данные из old_data
        if old_data and pool_name in old_data:
            for key in data:
                work_data[key] = data[key] - old_data[pool_name][key]
                # old_data[pool_name][key] = ...
                  #непонятно что здесь писать....
        else:
            old_data[pool_name] = data
    with open(file_path, "w") as f:
        json.dump(old_data, f)
if __name__ == "__main__":
    main()

быть может, будет легче найти решение с теми двумя строками, что в моем предыдущем сообщении? т.к. здесь структура переделана и чтобы вникнуть во всё понадобится время, я еще только падаван

Отредактировано nax83 (Сен. 4, 2015 15:50:00)

Офлайн

#9 Сен. 4, 2015 15:54:38

sander
Зарегистрирован: 2015-02-19
Сообщения: 317
Репутация: +  53  -
Профиль   Отправить e-mail  

Проблема с кодом, нужна помощь

nax83
я не понимаю, что за проблема у тебя с этими строками, поэтому помочь не могу
тебе нужно данные в файле для пула обновить как нибудь? если да, то там в цикле делаешь то что нужно

Отредактировано sander (Сен. 4, 2015 15:56:01)

Офлайн

#10 Сен. 4, 2015 16:35:45

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 9744
Репутация: +  843  -
Профиль   Отправить e-mail  

Проблема с кодом, нужна помощь

nax83
Есть команда консольная, которая выводит таблицу.
Для начала сохрани вывод в файл и пиши обработку этого файла. Вывод потом подключишь к готовой программе.

nax83
Мне нужно тело таблицы обрабатывать и из ее данных высчитывать скорость чтения/записи файлов.
Опиши конкретно алгоритм без кода.

nax83
Причем в теле таблицы может быть как два(сейчас), так и более пулов (сейчас-это data,metadata), поэтому я в коде делаю условие “если начало строки не содержит…..”
Вот разные файлы сделай с разными вариантами, которые могут быть, и для них делай обработку разными функциями.

nax83
Есть идея каким-то массивом в конце выводить правильно получаемые данные, т.к. сейчас уже вижу частично работающую схему.
Ты ещё обработку не сделал, выводить нечего.


Подготовь эти файлы, выложи их в теге кода или прикрепи к сообщению.
n1      n2
типа такого
типа такого
типа такого
Опиши конкретно алгоритм вычислений (из чего данные преобразуются и во что превращаются).

А вот этот код, который у тебя сейчас получился, - это просто каша-малаша. Всё должно быть по функциям разложено (структурная парадигма программирования).



Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version