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

news2024/11/23 22:12:05

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

import MySQLdb
from sshtunnel import SSHTunnelForwarder

class SSHMySQL(object):
    def __init__(self):
        self.server = self.get_server()
        self.conn = self.get_conn()
        self.cur = self.conn.cursor()

    def __enter__(self):
        return self

    def 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 server

    def get_conn(self):
        # 开启隧道
        self.server.start()
        # 使用MySQLdb的connect()方法连接数据库
        conn = MySQLdb.connect(
            host='127.0.0.1',  # 此处必须是127.0.0.1
            port=self.server.local_bind_port,
            user='root',
            password='',
            db='ecos',
            charset='utf8'
        )
        return conn

    def 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 = data
            return response
        except Exception as e:
            # 回滚当前事务
            self.conn.rollback()
            raise e

    def 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 = data
            return response
        except Exception as e:
            # 回滚当前事务
            self.conn.rollback()
            raise e

    def __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_discount
    print('{}-->云主机价格为:{}元;系统盘价格为:{}元'.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.coloradmin.cn/o/1044391.html

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

相关文章

Java BigDecimal 详解

目录 一、BigDecimal 1、简介 2、构造器描述 3、方法描述 4、使用 一、BigDecimal float和double类型的主要设计目标是为了科学计算和工程计算。他们执行二进制浮点运算,这是为了在广域数值范围上提供较为精确的快速近似计算而精心设计的。然而,它…

25841-2017 1000kV电力系统继电保护技术导则

声明 本文是学习GB-T 25841-2017 1000kV电力系统继电保护技术导则. 而整理的学习笔记,分享出来希望更多人受益,如果存在侵权请及时联系我们 1 范围 本标准规定了交流1000 kV 系统及1000 kV 变电站相关电压等级具有特别要求的继电保护装置 的基本准则。 本标准适用于1000 k…

大厂秋招真题【BFS+DP】华为20230921秋招T3-PCB印刷电路板布线【欧弟算法】全网最全大厂秋招题解

题目描述与示例 题目描述 在PCB印刷电路板设计中,器件之间的连线,要避免线路的阻抗值增大,而且器件之间还有别的器任和别的干扰源,在布线时我们希望受到的干扰尽量小。 现将电路板简化成一个M N的矩阵,每个位置&am…

如何快速学习AdsPower RPA(1)——简单、进阶部分

你是否刚开始学习使用AdsPower的RPA功能? 你是否对着这些操作选项头皮发麻,不知所措? 你是否想快速学会RPA? 你是否想编写出满足各种业务场景的RPA流程? 以上这些,Tool哥统统都帮你搞定! Too…

科技成果鉴定测试有多重要?可出具专业测试报告的软件测评机构推荐

科技成果鉴定测试在现代社会中具有重要意义,它不仅可以评估科技成果的价值和可行性,还可以为科技创新提供决策依据,推动科技进步和社会发展,那么科技成果鉴定测试究竟重要在哪呢? 1、对于科技项目的投资决策至关重要。鉴定测试可…

YOLOV8-DET转ONNX和RKNN

目录 1. 前言 2.环境配置 (1) RK3588开发板Python环境 (2) PC转onnx和rknn的环境 3.PT模型转onnx 4. ONNX模型转RKNN 6.测试结果 1. 前言 yolov8就不介绍了,详细的请见YOLOV8详细对比,本文章注重实际的使用,从拿到yolov8的pt检测模型&…

玩转gpgpu-sim 04记—— __cudaRegisterBinary() of gpgpu-sim 到底做了什么

官方文档&#xff1a; GPGPU-Sim 3.x Manual __cudaRegisterBinary(void*) 被执行到的代码逻辑如下&#xff1a; void** CUDARTAPI __cudaRegisterFatBinary( void *fatCubin ) { #if (CUDART_VERSION < 2010)printf("GPGPU-Sim PTX: ERROR ** this version of GPGPU…

查看Linux系统信息的常用命令

文章目录 1. 机器配置查看2. 常用分析工具3. 常用指令解读3.1 lscpu 4. 定位僵尸进程5. 参考 1. 机器配置查看 # 总核数物理CPU个数x每颗物理CPU的核数 # 总逻辑CPU数物理CPU个数x每颗物理CPU的核数x超线程数 cat /proc/cpuinfo| grep "physical id"| sort| uniq| w…

电子电路学习笔记之NCV6324BMTAATBG——同步降压转换器

关于同步降压转换器&#xff1f; 是一种广泛应用于各种电子产品中的转换器。它具有输入范围宽、转换效率高、输出电流大等优点。在同步降压型转换器的驱动电路中&#xff0c;一般包括电平移位电路、死区时间控制电路以及过零检测电路等。 电平移位电路用于将固定电平Vcc和GND…

86、Redis 的 value 所支持的数据类型(String、List、Set、Zset、Hash)---->String相关命令

本次讲解要点&#xff1a; String相关命令&#xff1a;String是指value中的数据类型 启动redis服务器&#xff1a; 打开小黑窗&#xff1a; C:\Users\JH>e: E:>cd E:\install\Redis6.0\Redis-x64-6.0.14\bin E:\install\Redis6.0\Redis-x64-6.0.14\bin>redis-server.…

【知识点随笔分析】我看看谁还不会用CURL命令

目录 前言&#xff1a; CURL介绍&#xff1a; CURL的基本使用&#xff1a; CURL与PING命令的区别&#xff1a; CURL命令的应用&#xff1a; 总结&#xff1a; 前言&#xff1a; 当今互联网时代&#xff0c;与服务器进行数据交互成为了无法回避的需求。无论是获取Web…

电脑入门:电脑不认新硬盘时该怎么办?

电脑不认新硬盘时该怎么办? 当新硬盘加进后,正常工作时,没有什么问题。若电脑遇到特殊情况时,电脑对新硬盘“不认”,可采取以下措施让电脑重新“认”新硬盘,显示新分区(如G、H、I、J)。 咱的目的是保持S-ATA的开启,把控制板载S-ATA设定值由No变成Yes就可以。 首…

mysql 8.0.34 安装

1、进入mysql官网 &#xff1a;https://www.mysql.com/ 拉到最下面&#xff0c;选择社区服务 2、下载mysql服务 msi方式的参考&#xff1a;https://blog.csdn.net/m0_59086544/article/details/129034408。 这里介绍下zip格式的怎么使用&#xff01; 3、 安装服务 下载好 z…

使用Webpack设置TS引用模块,解决Module not found: Error: Can‘t resolve ‘./m1‘ in ...问题

当我们把ts文件作为模块被引用的时候&#xff0c;我们使用Webpack打包代码会报错&#xff1a; Module not found: Error: Cant resolve ./m1 in ... 解决方法&#xff1a; 在webpack.config.js文件中配置如下代码&#xff1a; module.exports {// 设置引用模块resolve: {ext…

React 全栈体系(十七)

第九章 React Router 6 一、概述 React Router 以三个不同的包发布到 npm 上&#xff0c;它们分别为&#xff1a; react-router: 路由的核心库&#xff0c;提供了很多的&#xff1a;组件、钩子。react-router-dom: 包含 react-router 所有内容&#xff0c;并添加一些专门用于 …

解决oss视频上传后截取的第一帧图片被旋转问题

因此,直接配置参数ar_auto就okpic.url ?x-oss-processvideo/snapshot,t_1000,m_fast,ar_auto

Unity Game FrameWork—模块使用—资源热更新

工程选项配置​ json文件解析不要用默认的unity解析方式&#xff0c;unity解析有问题&#xff0c;使用StarForce.LitJsonHelper​ ​ 资源模式改为热更新模式​ ​ 配置文件配置​ BuiltinDataComponent自定义组件引用率了Buildinfo.txt配置文件&#xff0c;该文件配置了热更…

根据excel批量修改文件夹及其文件名称

简介 表哥公司电脑上有一大批文件夹&#xff0c;用于存放一些pdf。他希望对这些文件进行整理。文件夹批量重命名为好记一些的名字&#xff0c;文件夹下的pdf改成的名字格式为&#xff1a;文件夹名序号。 例如&#xff1a;文件夹从“1234”&#xff0c;改成“案件001”&#xf…

Sql注入(手工注入思路、绕过、防御)

一、Sql注入思路 1、判断注入点 在GET参数、POST参数、以及HTTP头部等&#xff0c;包括Cookie、Referer、XFF(X-Forwarded-for)、UA等地方尝试插入代码、符号或语句&#xff0c;尝试是否存在数据库参数读取行为&#xff0c;以及能否对其参数产生影响&#xff0c;如产生影响则…

Snapdragon Profiler分析Android GPU

Snapdragon Profiler&#xff08;骁龙分析器&#xff09;是一款性能分析软件&#xff0c;在Windows、 Mac、和 Linux平台上都可以运行&#xff0c;主要是用来分析使用了高通骁龙处理器的Android设备。 Snapdragon Profiler通过USB连接这些Android设备&#xff0c;开发者可以用…