pytho实例--pandas读取表格内容

前言:由于运维反馈帮忙计算云主机的费用,特编写此脚本进行运算
如图,有如下excel数据
在这里插入图片描述
计算过程中需用到数据库中的数据,故封装了一个读取数据库的类

import MySQLdb
from sshtunnel import SSHTunnelForwarderclass SSHMySQL(object):def __init__(self):self.server = self.get_server()self.conn = self.get_conn()self.cur = self.conn.cursor()def __enter__(self):return selfdef get_server(self):# 使用SSH隧道,通过跳板机连接数据库server = SSHTunnelForwarder(('192.xx.xx.xx', 22),  # 跳板机地址ssh_username='xxxx',  # 跳板机账号ssh_password='xxxx',  # 跳板机密码remote_bind_address=('127.0.0.1', 3306)  # MySql服务器)return serverdef get_conn(self):# 开启隧道self.server.start()# 使用MySQLdb的connect()方法连接数据库conn = MySQLdb.connect(host='127.0.0.1',  # 此处必须是127.0.0.1port=self.server.local_bind_port,user='root',password='',db='ecos',charset='utf8')return conndef get_query_one(self, query, param=None):try:# 使用execute()方法执行SQL语句self.cur.execute(query, param)# 提交当前事务self.conn.commit()# 使用fetchone()方法获取第一条数据data = self.cur.fetchone()if data is not None:response = dict(zip([k[0] for k in self.cur.description], data))else:response = datareturn responseexcept Exception as e:# 回滚当前事务self.conn.rollback()raise edef get_query_all(self, query, param=None):try:# 使用execute()方法执行SQL语句self.cur.execute(query, param)# 提交当前事务self.conn.commit()# 使用fetchall()方法获取全部数据data = self.cur.fetchall()if data is not None:response = [dict(zip([k[0] for k in self.cur.description], row)) for row in data]else:response = datareturn responseexcept Exception as e:# 回滚当前事务self.conn.rollback()raise edef __exit__(self, exc_type, exc_val, exc_tb):# 关闭游标self.cur.close()# 关闭数据库连接self.conn.close()# 关闭隧道self.server.close()def db_query(self, query, param):res = self.get_query_one(query, param)print(res)if __name__ == '__main__':with SSHMySQL() as db:query = "SELECT * FROM user WHERE surname = %s"param = ('yx_01',)res = db.get_query_all(query, param)print(res)

封装后,调试一下,可以正常读取数据库内容,使用pandas模板读取excel表中的数据,进行运算

import pandas as pd
import calendar
import re
import datetime
from sql.connect_sql import SSHMySQL# 基础信息
file_path = r'C:\Users\阿娇啊\Desktop\主机概览.xlsx'
# 云主机和磁盘的折扣
vm_discount = 0.01
cloud_discount = 0.01
# 购买周期(按月计费)
vm_cycle = 3
c_cycle = 3
# 当前年月日
now = datetime.datetime.now()
year = now.year
month = now.month
day = now.day
cma_days = calendar.monthrange(year, month)[1]
cmr_days = cma_days - day + 1# 读取sheet云主机数据
usecols_vm = ['名称', '规格配置', '系统盘类型']
df_vm = pd.read_excel(file_path, sheet_name='云主机', usecols=usecols_vm)
len_vm = len(df_vm.index)
print('云主机基础信息:------------')
print('总行数为:{};本月剩余天数为:{};云主机折扣为:{};系统盘折扣为:{};购买周期为:{}个月'.format(len_vm, cmr_days, vm_discount, cloud_discount, vm_cycle))# 价格 = (单价*12个月/365天*本月剩余天数)+剩余月数*单价
# 云主机价格
vm_list = []
sc_list = []
for i in range(0, len_vm):# 按行和列 获取表格数据vm_name = df_vm.iloc[i]['名称']sc_type = df_vm.iloc[i]['系统盘类型']spec_con = df_vm.iloc[i]['规格配置']# 正则匹配云主机规格、系统盘大小及单位,并转换为字符串pat_vm = '\w*.\w*.\w'pat_sc = '系统盘: \w*'pat_sc_size = '\d.'pat_sc_unit = 'TB|GB'vm_spec = re.compile(pat_vm).findall(spec_con)[0]sc = re.compile(pat_sc).findall(spec_con)[0]sc_size = re.compile(pat_sc_size).findall(sc)[0]sc_unit = re.compile(pat_sc_unit).findall(sc)[0]# 从数据库获取云主机规格单价和系统盘单价with SSHMySQL() as db:query = "SELECT CAST(monthly as CHAR) as monthly FROM `spec` WHERE name= %s and type = 'VIRTUALMACHINE'"vm_param = (vm_spec, )vm_res = db.get_query_all(query, vm_param)vm_month = float((vm_res[0])['monthly'])# print('云主机单价为:', vm_month)query = "SELECT CAST(monthly as CHAR) as monthly FROM `spec` WHERE name= %s and type = 'CLOUDDISK'"sc_param = (sc_type,)sc_res = db.get_query_all(query, sc_param)sc_month = float((sc_res[0])['monthly'])# print('系统盘单价为:', sc_month)# 云主机价格vm_price = (vm_month*12/365*cmr_days+(vm_cycle-1)*vm_month)*vm_discount# 系统盘价格sc_price = (sc_month*float(sc_size)*12/365*cmr_days+(vm_cycle-1)*sc_month*float(sc_size))*cloud_discountprint('{}-->云主机价格为:{}元;系统盘价格为:{}元'.format(vm_name, vm_price, sc_price))vm_list.append(vm_price)sc_list.append(sc_price)print('云主机总价为:{};系统盘总价为:{}'.format(sum(vm_list), sum(sc_list)))

运算结果为:
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/91521.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【Java】成员变量与局部变量的区别

问题:什么是成员变量与局部变量 成员变量:类中的方法外的变量 就是成员变量局部变量:方法中的变量 局部变量 区别成员变量局部变量类中位置不同类中方法外类中方法里内存中 位值堆内存栈内存生命周期不同随着对象存在而存在,随着对…

win11+wsl+git+cmake+x86gcc+armgcc+clangformat+vscode环境安装

一、安装wsl (1)打开power shell 并运行: Enable-WindowsOptionalFeature -Online -FeatureName Microsoft-Windows-Subsystem-Linux Enable-WindowsOptionalFeature -Online -FeatureName VirtualMachinePlatform (2&#xff0…

关于layui upload上传组件上传文件无反应的问题

最近使用layui upload组件时,碰到了上传文件无反应的问题,感到非常困惑。 因为使用layui upload组件不是一次两次了,之前每次都可以,这次使用同样的配方,同样的姿势,为什么就不行了呢? 照例先…

【图像分割】图像检测(分割、特征提取)、各种特征(面积等)的测量和过滤(Matlab代码实现)

💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️座右铭&a…

蓝牙核心规范(V5.4)11.6-LE Audio 笔记之初识音频位置和通道分配

专栏汇总网址:蓝牙篇之蓝牙核心规范学习笔记(V5.4)汇总_蓝牙核心规范中文版_心跳包的博客-CSDN博客 爬虫网站无德,任何非CSDN看到的这篇文章都是盗版网站,你也看不全。认准原始网址。!!! 音频位置 在以前的每个蓝牙音频规范中,只有一个蓝牙LE音频源和一个蓝牙LE音频接…

Python函数式编程(三)操作符函数(operator)

operator 模块提供了一套与Python的内置运算符对应的高效率函数。例如,operator.add(x, y) 与表达式 xy 相同。 许多函数名与特殊方法名相同,只是没有双下划线。为了向后兼容性,也保留了许多包含双下划线的函数。为了表述清楚,建议…

跳转传参的方式

在Web开发中,跳转传参的方式有以下几种: 1.查询字符串(Query String):通过URL的查询字符串传递参数。可以在URL后面添加?符号,然后以键值对的形式传递参数,不同参数之间使用&符号分隔。 示例: // 跳…

node版本问题:Error: error:0308010C:digital envelope routines::unsupported

前言 出现这个错误是因为 node.js V17及以后版本中最近发布的OpenSSL3.0, 而OpenSSL3.0对允许算法和密钥大小增加了严格的限制,可能会对生态系统造成一些影响. 在node.js V17以前一些可以正常运行的的应用程序,但是在 V17 及以后版本可能会抛出以下异常: 我重装系统前,用的…

三个要点,掌握Spring Boot单元测试

单元测试是软件开发中不可或缺的重要环节,它用于验证软件中最小可测试单元的准确性。结合运用Spring Boot、JUnit、Mockito和分层架构,开发人员可以更便捷地编写可靠、可测试且高质量的单元测试代码,确保软件的正确性和质量。 一、介绍 本文…

【自学记录】深度学习入门——基于Python的理论与实现(第4章 神经网络的学习)

4.2 损失函数 #损失函数 #均方误差 def mean_squared_error(y,t):return 0.5*np.sum((y-t)**2) #交叉熵误差 def _cross_entropy_error(y,t):delta1e-7return -np.sum(t*np.log(ydelta))#交叉熵损失函数 def cross_entropy_error(y,t):if y.ndim1:tt.reshape(1,t.size)yy.resh…

Lua学习笔记:require非.lua拓展名的文件

前言 本篇在讲什么 Lua的require相关的内容 本篇需要什么 对Lua语法有简单认知 对C语法有简单认知 依赖Visual Studio工具 本篇的特色 具有全流程的图文教学 重实践,轻理论,快速上手 提供全流程的源码内容 ★提高阅读体验★ 👉 ♠…

uni-app 之 短信验证码登录

uni-app 之 短信验证码登录 image.png image.png <template><view style"width: 100%; display: flex; flex-direction:column; align-items:center;"><view style"width: 300px; margin-top: 100px;"><!-- // --><!-- 1&#…

uni-app:实现密码框内容展示与隐藏

效果 代码 <template><view class"container"><view class"item_left"><view>密码</view><view class"eye_position" taptoggleShowPassword><image :srceye v-ifisShowPassword /><image :srcey…

DBRichEdit关联ClientDataSet不能保存的Bug

ClientDataSet的最大好处&#xff0c;就是建立能内存表&#xff0c;特别DataSnap三层运用中&#xff0c;主要使用ClientDataSet与运程的服务器中的数据表&#xff0c;建立读取存贮关系。 在软件的使用中&#xff0c;总有客户反映&#xff0c;一些数据不能保存。 发现都是使用DB…

Springboot中使用拦截器、过滤器、监听器

一、Servlet、Filter&#xff08;过滤器&#xff09;、 Listener&#xff08;监听器&#xff09;、Interceptor&#xff08;拦截器&#xff09; Javaweb三大组件&#xff1a;servlet、Filter&#xff08;过滤器&#xff09;、 Listener&#xff08;监听器&#xff09; Spring…

nodejs在pdf中绘制表格

需求 之前我已经了解过如何在pdf模板中填写字段了 nodejs根据pdf模板填入中文数据并生成新的pdf文件https://blog.csdn.net/ArmadaDK/article/details/132456324 但是当我具体使用的时候&#xff0c;我发现我的模板里面有表格&#xff0c;表格的长度是不固定的&#xff0c;所…

Bluespec SytemVerilog 握手协议接口转换

01、引言 由于接口控制信号上的差异&#xff0c;要实现Bluespec SystemVerilog(BSV)生成的代码和外部Verilog代码之间的正确交互是一件比较麻烦同时容易出错的事情。在BSV中, 模块之间的交互都是基于Action或ActionValue这两类method完成。下图展示了使用BSV设计的某一模块的接…

git 误删分支恢复方法

在使用git的过程中&#xff0c;因为人为因素造成分支&#xff08;commit)被删除&#xff0c;可以使用以下步骤进行恢复。 首先用以下步骤创建一个新分支&#xff0c;修改一些文件后删除&#xff0c;以便进行恢复。 1.创建分支 abc git branch abc2.查看分支列表 git branch …

深度学习在图像识别领域还有哪些应用?

深度学习在图像识别领域的应用非常广泛&#xff0c;除了之前提到的图像分类、目标检测、语义分割和图像生成&#xff0c;还有其他一些应用。 图像超分辨率重建&#xff1a;深度学习技术可以用于提高图像的分辨率&#xff0c;例如通过使用生成对抗网络&#xff08;GAN&#xff…

RK3588安装python3.11(ubuntu18.04)

1.前言 看到rknn_toolkit_lite2更新了python3.11的安装包&#xff0c;马上更新一下 2.RK3588安装python3.11 Ubuntu上编译Python 3.11&#xff0c;您可以按照以下步骤进行操作&#xff1a; (1) 准备编译环境 在开始之前&#xff0c;确保您的系统已安装必要的编译工具和依赖项…