Форум сайта python.su
Добрый день!
имеется код, благодаря которому значению присваивается две строки, например:
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()
Отредактировано nax83 (Сен. 4, 2015 09:19:50)
Офлайн
nax83
ужасное описание, ужасный код. удалите из кода все не нужное вроде
import fileinput
print ("\n")
Офлайн
# -*- 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()
Отредактировано nax83 (Сен. 4, 2015 13:33:24)
Офлайн
Саму задачу конкретно опиши без кода.
Офлайн
Есть команда консольная, которая выводит таблицу.
Мне нужно тело таблицы обрабатывать и из ее данных высчитывать скорость чтения/записи файлов.
Причем в теле таблицы может быть как два(сейчас), так и более пулов (сейчас-это data,metadata), поэтому я в коде делаю условие “если начало строки не содержит…..”
По итогу я пытаюсь присвоить словарю полученные данные из вырезки, однако получаемые данные верно вытянуть не получается.
как ни стараюсь-получаю значение присваиваемой переменной из двух строк(числа,которые между собой нужно будет просуммировать, или др.),эти числа я никак не могу разделить…
Есть идея каким-то массивом в конце выводить правильно получаемые данные, т.к. сейчас уже вижу частично работающую схему. Сейчас, т.к. одной переменной присвоено два значения, - вывод инфы делается дважды, где пытаются учавствовать все необходимые мне числа.
Бубна для танцев вокруг монитора с кодом нет, поэтому прошу помощи.
Офлайн
Попробую немного упростить понимание ситуации, постарался вырезать из кода отвлекающие внимание элементы:
# -*- 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()) #вот эта команда выводит злополучные две строки
Отредактировано nax83 (Сен. 4, 2015 15:24:31)
Офлайн
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()
Офлайн
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)
Офлайн
nax83
я не понимаю, что за проблема у тебя с этими строками, поэтому помочь не могу
тебе нужно данные в файле для пула обновить как нибудь? если да, то там в цикле делаешь то что нужно
Отредактировано sander (Сен. 4, 2015 15:56:01)
Офлайн
nax83Для начала сохрани вывод в файл и пиши обработку этого файла. Вывод потом подключишь к готовой программе.
Есть команда консольная, которая выводит таблицу.
nax83Опиши конкретно алгоритм без кода.
Мне нужно тело таблицы обрабатывать и из ее данных высчитывать скорость чтения/записи файлов.
nax83Вот разные файлы сделай с разными вариантами, которые могут быть, и для них делай обработку разными функциями.
Причем в теле таблицы может быть как два(сейчас), так и более пулов (сейчас-это data,metadata), поэтому я в коде делаю условие “если начало строки не содержит…..”
nax83Ты ещё обработку не сделал, выводить нечего.
Есть идея каким-то массивом в конце выводить правильно получаемые данные, т.к. сейчас уже вижу частично работающую схему.
n1 n2
типа такого
типа такого
типа такого
Офлайн