python 日志装饰器结合函数实例(python自动化办公)

news2024/11/5 17:18:22

面向对象编程过程的实例:
1)数据准备
2)数据处理、加工方式
3)数据校验

# -*- coding: utf-8 -*-
import pyodbc
import xlrd
import numpy as np
import openpyxl
import win32com.client
import time
import datetime
import pythoncom
import os
import re
import imaplib
import xlwings as xw
import pandas as pd
import zipfile
import psutil
import subprocess
from con_data import EmailInfo
import logging
import functools
from pathlib import Path


class ReadData():
    
    def __init__(self):
        #配置logging装饰器
        logging.basicConfig(filename=r'C:\*****\info.log', 
                            filemode='w',
                            format='%(asctime)s | %(levelname)s | %(message)s',
                            datefmt='%Y-%m-%d %H:%M:%S',
                            level=logging.INFO)
        logging.basicConfig(level=logging.WARNING)
        logging.basicConfig(level=logging.ERROR)
        self.path = r"C:\*****\"
        self.current_date = datetime.datetime.now()
        self.last_month = self.current_date - datetime.timedelta(days=self.current_date.day)
        self.last_month_month = self.last_month.strftime("%Y%m")
        self.file_name=f'{self.last_month_month}.csv'
        self.zip_name=f'{self.last_month_month}.zip'
        self.file_path=os.path.join(self.path,self.file_name)
        self.zip_path=os.path.join(self.path,self.zip_name)
        

    def logged(func):
        @functools.wraps(func)
        def with_logging(*args, **kwargs):
            try:
                start_time = time.time()
                result = func(*args, **kwargs)
                end_time = time.time()
                execution_time = end_time - start_time
                logging.info(f"Function {func.__name__} executed in {execution_time} seconds")          
                logging.info(f"{func.__name__} returned {result}")
                logging.warning(f"Calling {func.__name__!r} with {' and '.join(map(str, args))}")
                logging.warning(f"{func.__name__} returned: {result}")
                return result
            except Exception as e:
                logging.error(f"Error in function {func.__name__}: {e}")
                raise    
        return with_logging
        
    #此函数表示的是获取每年的每个月最后工作日
    @logged
    def get_workingday(self):
        self.now = pd.Timestamp.now()
        self.last_day=pd.Timestamp(year=self.now.year,month=self.now.month-1,day=1)+pd.offsets.MonthEnd(1)
        while self.last_day.weekday()>=5:
            self.last_day-=pd.Timedelta(days=1)
            self.last_date=int(self.last_day.strftime("%Y%m%d"))    
        else:
            self.last_date=int(self.last_day.strftime("%Y%m%d"))           
        print(self.last_date)
        return self.last_date

	#此函数可以表示读取本地odbc数据源配置的数据库驱动
    @logged
    def read_odbc(self):
        Data = ReadData
        self.date=Data.get_workingday(self)
        self.connection_string=(
            "*****"
            "Host=*****"
            "Port=******;"  
        )
        
        self.conn=pyodbc.connect(self.connection_string, autocommit=True)

        self.sql=f"********;"
        
        self.df=pd.read_sql(self.sql,self.conn)
        return self.df

	#表示结束本地excel进程
    @logged
    def kill_excel_by_pids(self):
        self.pids=psutil.pids()
        for pid in self.pids:
            try:
                p=psutil.Process(pid)
                if p.name()=='EXCEL.EXE':
                    cmd='taskkill/F/IM EXCEL.EXE'
                    os.system(cmd)
                    
            except Exception as e:
                print(e)
    
    #表示刷新本地excel数据透视表
    @logged
    def refresh_pivot(self):
        App=xw.App(visible=False,add_book=False)
        wb=App.books.open(r"C:******.xlsx")
        sheet=wb.sheets('Sheet1')
        res=sheet.api.PivotTables('PivotTable1').PivotCache().Refresh()
        wb.save()
        wb.close()
        App.quit()
    
    #加密压缩csv or excel文件(按需转换)
    @logged
    def csv_zip(self):
        self.pwd='********'
        self.addpassword = '-p%s'%(self.pwd)
        Data = ReadData
        self.data=Data.read_odbc(self)
        self.data.to_csv(self.file_path, index=False)
        if  os.path.exists(self.file_path)==True:
            self.cmd = ['7z','a',self.zip_path,self.file_path,self.addpassword,'-tzip']
            subprocess.Popen(self.cmd,executable=r'C:\Program Files\7-Zip\7z.exe')
            print("Compress Complete 100%")            
        else:
            print("No Files")
        
        return self.zip_path
	
	#python 结合 outlook api实例
    @logged    
    def send_email(self):
        Data = ReadData
        self.path=Data.csv_zip(self)
        self.subject='******'
        self.body=f"""
        **********\n
        Best regards,\n
        Anna"""
        self.recipient='********'
        
        outlook=win32com.client.Dispatch('Outlook.Application')
        mail=outlook.CreateItem(0)
        mail.Subject=self.subject
        mail.Body=self.body
        mail.To=self.recipient
        mail.Attachments.Add(Source=self.path)
        mail.Send()
    
    #遍历文件夹下数据最新更新时间、大小、名字,数据校验阶段
    @logged
    def check_data(self):
        self.latest_files = []
        self.check_infos=[]
        self.folder_path = r'*********'  # 替换为你的文件夹路径
        self.n = 4 
        for filename in os.listdir(self.folder_path):
            file_path = os.path.join(self.folder_path, filename)
            if os.path.isfile(self.file_path):
                file_stats = os.stat(file_path)
                self.latest_files.append((filename, file_stats.st_size, file_stats.st_mtime))

        self.latest_files.sort(key=lambda x: x[2], reverse=True)
        for filename, filesize, mtime in self.latest_files[:self.n]:
            filesize=filesize//1024
            dt_object = datetime.datetime.fromtimestamp(mtime)
            date_string = dt_object.strftime('%Y-%m-%d %H:%M:%S')
            check_info=f"文件名: {filename}, 大小: {filesize } KB, 最后修改时间: {date_string}"
            self.check_infos.append(check_info)
            print(f"文件名: {filename}, 大小: {filesize } KB, 最后修改时间: {date_string}")
        return self.check_infos
    
if __name__ == '__main__':
    Data = ReadData()
    Data.send_email()
    Data.check_data()






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

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

相关文章

python之数据结构与算法(数据结构篇)-- 栈

一、栈的概念 这里我们不去了解教科书上面的“教条概念”,其实“栈”的概念和古代的时候的“客栈”是有异曲同工之妙的。 在这里我们把客栈看成“栈”,旅客看作“栈元素” 1.当旅客进来住店时,叫做“入栈”; 2.当旅客退房时&#…

Java调用chatgpt

目前openai的chatgpt在国内使用有一定难度,不过国内的大模型在大部分情况下已经不弱于chatgpt,而且还更便宜,又能解决国内最敏感的内容安全问题。本文后续以spring ai调用国内chatgpt厂商实现为例,讲解怎么构建一个java调用chatgp…

web前端多媒体标签设置(图片,视频,音频)以及图片热区(usemap)的设置

多媒体标签运用 在HTML中有以下常见多媒体标签&#xff1a; <img> &#xff08;图像标签&#xff09; - 作用&#xff1a;用于在网页中嵌入图像。 - 示例&#xff1a; <img src"image.jpg" alt"这是一张图片"> 。其中 src 属性指定图像的…

安卓开发之数据库的创建与删除

目录 前言&#xff1a;基础夯实&#xff1a;数据库的创建数据库的删除注意事项 效果展示&#xff1a;遇到问题&#xff1a;如何在虚拟机里面找到这个文件首先&#xff0c;找到虚拟机文件的位置其次&#xff0c;找到数据库文件的位置 核心代码&#xff1a; 前言&#xff1a; 安…

基于SSM+微信小程序的订餐管理系统(点餐2)

&#x1f449;文末查看项目功能视频演示获取源码sql脚本视频导入教程视频 1、项目介绍 基于SSM微信小程序的订餐管理系统实现了管理员和用户。管理端实现了 首页、个人中心、用户管理、菜品分类管理、菜品信息管理、订单信息管理、配送信息管理、菜品评价管理、订单投诉管理、…

《AI在企业战略中的关键地位:以微软和阿里为例》

内容概要 在当今商业环境中&#xff0c;人工智能&#xff08;AI&#xff09;的影响力如滔滔洪水&#xff0c;愈演愈烈。文章将揭示AI在企业战略中的崛起&#xff0c;尤其以微软和阿里巴巴为代表的企业&#xff0c;这两家科技巨头通过不同方式&#xff0c;将智能技术融入其核心…

华为荣耀曲面屏手机下面空白部分设置颜色的方法

荣耀部分机型下面有一块空白区域&#xff0c;如下图红框部分 设置这部分的颜色需要在themes.xml里面设置navigationBarColor属性 <item name"android:navigationBarColor">android:color/white</item>

【ESP32】ESP-IDF开发 | I2C从机接收i2c_slave_receive函数的BUG导致程序崩溃解决(idf-v5.3.1版本)

1. 问题 在调试I2C外设的demo时&#xff0c;按照官方文档的描述调用相关API&#xff0c;烧录程序后发现程序会不断崩溃&#xff0c;系统log如下。 初步分析log&#xff0c;原因是访问到了不存在的地址。一开始我以为是自己的代码问题&#xff0c;反反复复改了几次都会出现同样的…

企业数字化转型实施中的挑战与解决方案:架构引领的战略路径

在企业推动数字化转型的过程中&#xff0c;通常会面临复杂的挑战。随着技术的不断演进和业务环境的变化&#xff0c;企业架构&#xff08;Enterprise Architecture, EA&#xff09;成为帮助企业应对这些挑战的关键工具。通过提供一个全面的战略蓝图&#xff0c;EA使企业能够在保…

桑基图在医学数据分析中的更复杂应用示例

桑基图&#xff08;Sankey Diagram&#xff09;能够有效地展示复杂的流动关系&#xff0c;特别适合用于医学数据分析中的多种转归和治疗路径的可视化。接下来&#xff0c;我们将构建一个稍微复杂的示例&#xff0c;展示不同疾病患者在治疗过程中的流动&#xff0c;以及他们的治…

[SICTF Round4] PWN

这PWN题似乎是给我出的&#xff0c;4个一血1个2血。密码又过于简单。逆向太难了又不大会。 Stack fengshui main可以溢出覆盖rbpret所以它每一步都需要移栈。 可用的ROP里没有pop rdi,在4004c0里有错位的01 5d c3 &#xff1a;add DWORD PTR [rbp-0x3d], ebx 并且有对应的p…

消息中间件类型介绍

ActiveMQ&#xff1a; ActiveMQ可是个老将了&#xff0c;它功能全面、稳定可靠&#xff0c;还支持多种协议和编程语言。如果你需要一个兼容性好、易于集成的消息中间件&#xff0c;ActiveMQ可是个不错的选择。 RabbitMQ&#xff1a; RabbitMQ以其简单易用和高性能著称。它支持丰…

【设计模式系列】组合模式(十二)

目录 一、什么是组合模式 二、组合模式的角色 三、组合模式的典型应用 四、组合模式在Mybatis SqlNode中的应用 4.1 XML映射文件案例 4.2 Java代码使用案例 一、什么是组合模式 组合模式&#xff08;Composite Pattern&#xff09;是一种结构型设计模式&#xff0c;其核…

Ghidra无头模式(自动化批处理执行重复性任务)

Ghidra无头模式&#xff08;自动化批处理执行重复性任务&#xff09; 与Ghidra GUI探索单个项目中的单个文件不同&#xff0c;Ghidra headless analyzer&#xff08;Ghidra无头分析器&#xff09;更加适合批处理和用脚本控制Ghidra。 &#xff08;一&#xff09;启动analyzeHea…

【大众点评】店铺评论 加密参数生成逆向分析

点击好评 https://www.dianping.com/ajax/json/shopDynamic/allReview 分析参数_token 直接搜_token 共17个&#xff0c;优先看和请求相关的 给第一个_token打上断点&#xff0c;然后切换评论&#xff0c;就直接断住了 n h(i, e.sendData) _token: n 现在给它打上断点&am…

Fsm3

采用读热码编写方式&#xff1a; module top_module(input clk,input in,input areset,output out); ////reg [3:0]A 4d0001;// reg [3:0]B 4d0010;//reg [3:0]C 4d0100;// reg [3:0]D 4d1000; //1、首先用读热码定义四个状态变量parameter A 4d0001 ,B 4d0010, C 4d01…

在腾讯云服务器上部署MaxKB项目(基于LLM大语言模型的知识库问答系统)

前言 一&#xff0c; MaxKB介绍 MaxKB是基于LLM大语言模型的知识库问答系统&#xff0c;旨在成为企业的最强大脑。它支持开箱即用&#xff0c;无缝嵌入到第三方业务系统&#xff0c;并提供多模型支持&#xff0c;包括主流大模型和本地私有大模型&#xff0c;为用户提供智能问…

【大众点评】加密参数生成逆向分析

点击好评 https://www.dianping.com/ajax/json/shopDynamic/allReview 分析参数_token 直接搜_token 共17个&#xff0c;优先看和请求相关的 给第一个_token打上断点&#xff0c;然后切换评论&#xff0c;就直接断住了 n h(i, e.sendData) _token: n 现在给它打上断点&am…

【Python+Pycharm】2024-Python安装配置教程

【PythonPycharm】2024-Python安装配置教程 一、下载装 Python 1、进入Python官网首页&#xff0c;下载最新的Python版本 Download Python | Python.org 选择对应版本下载 安装 测试安装情况 python如果安装失败 在系统环境变量添加安装路径 where pythonwin7安装路径添加…

Python中如何计算整商:详解整除运算及其应用场景

目录 一、整除运算的基本概念 1. 语法 2. 工作原理 二、整除运算的详细解析 1. 整数之间的整除 2. 浮点数之间的整除 3. 整数与浮点数之间的整除 三、整除运算的应用场景 1. 数据处理中的取整操作 2. 循环中的步进控制 3. 分页显示数据 4. 时间计算中的取整 四、整…