zoukankan      html  css  js  c++  java
  • RPA项目所遇知识点

    1艺赛旗 RPA 技术分享常见问题汇总贴

    2python标准库之glob介绍

    3RPA基础

    4RPA答疑

    5python3 遍历windows下 所有句柄及窗口名称

    import win32gui
    
    hwnd_title = dict()
    
    
    def get_all_hwnd(hwnd, mouse):
        if win32gui.IsWindow(hwnd) and win32gui.IsWindowEnabled(hwnd) and win32gui.IsWindowVisible(hwnd):
            hwnd_title.update({hwnd: win32gui.GetWindowText(hwnd)})
    
    
    win32gui.EnumWindows(get_all_hwnd, 0)
    
    for h, t in hwnd_title.items():
        if t is not "":
            print(h,t)
    View Code

    6 css select 知识相关

    7数据处理方面的问题

    1 Dataframe数据批量写入Excel
    import xlrd
    import xlsxwriter
    
    target_xls = r"C:UsersKun.ShiDesktopExcel3.xlsx"
    q=['核算项目编码','公司','业务','期末余额','报表','差异']
    # 写入数据
    workbook = xlsxwriter.Workbook(target_xls)
    worksheet = workbook.add_worksheet()
    font = workbook.add_format({"font_size":14})
    for n in range(len(q)):
        worksheet.write(2, n, q[n], font)
    for i in range(len(EAS_list)):
        for j in range(len(EAS_list[i])):
            worksheet.write(i+3, j, EAS_list[i][j], font)
    # 关闭文件流
    workbook.close()
    
    
    numpy数据的应用
    
    2.1 两个numpy数组合成一个
    import numpy as np
    from collections import Counter
    import pandas as pd
    month_list=np.vstack((month_list,month_list_x))
    
    2.2 numpy数据透析,并转为dataframe
    EAS_list = pd.DataFrame(EAS_list)
    EAS_list=pd.pivot_table(EAS_list,values=8,index=[3,0,1,2,4,5,6,7,9],aggfunc=np.sum,fill_value=0)
    EAS_list=EAS_list.reset_index().values
    
    2.3 numpy数组扩容
    d4= np.array([[0]*7]*len(sys_list_htjyjgmx_cyc))
    EAS_list_22020901=np.vstack((EAS_list_22020901,d4))
    
    2.4 读取Excel,空或者null的填0
    value_htbzjyeqd_zl=value_htbzjyeqd_zl.fillna(0)
    
    2.5 csv转xlsx
    import pandas as pd
    f=open(r'C:UsersKun.ShiDesktop张老师系统报表系统报表恒运宝报表1.csv')
    csv = pd.read_csv(f, encoding='utf-8')
    csv.to_excel(r'C:UsersKun.ShiDesktop张老师系统报表系统报表恒运宝报表1.xlsx', sheet_name='data')
    
    2.6 判断是否存在在创建文件
    import os
    path=[r'C:UsersuserDesktop对账表张雯',r'C:UsersuserDesktop对账表陈培君',r'C:UsersuserDesktop对账表朱佳莲',r'C:UsersuserDesktop对账表王欣元',r'C:UsersuserDesktop对账表胥文焉']
    print(path)
    for i in path:
        folder = os.path.exists(i)
        if not folder:  
            os.makedirs(i)
    
    2.7 numpy删除1,2行
    L_n=[1,2]
    EAS_list_22020701=np.delete(EAS_list_22020701,l_n,axis=0)
    
    2.8 numpy插入数组
    b = np.array([['']*len(sys_list_zlsybb_xw)])
    sys_list_zlsybb_xw=np.insert(sys_list_zlsybb_xw,1,values=b,axis=1)
    
    3 读取文件下的文件
    self.files_hengxing=[]
    file_dir=r'C:UsersKun.ShiDesktopiExcel1恒信'
    for root, dirs, files in os.walk(file_dir): 
        pass
    for i in range(len(files)):
        self.files_hengxing.append(os.path.join(root,files[i]))
    #print(self.files_hengxing) 
    
    
    def file_name(file_dir):   
        for self.root, dirs, self.files in os.walk(file_dir):  
           pass
    file_dir=r'C:UsersKun.ShiDesktopEAS_excel王欣元'
    file_name(file_dir)
    print(self.files)
    
    4 字典合并
    dict4=dict(dict1,**dict2)
    
    5 删除文件,移动文件
    import os,shutil
    shutil.rmtree(r'Z:shanghai计划财务部部门共享财务部资产管理部财务会计部月报RPA对账EAS_excel')
    shutil.copytree(r'C:UsersKun.ShiDesktopEAS_excel',r'Z:shanghai计划财务部部门共享财务部资产管理部财务会计部月报RPA对账EAS_excell')
    
    6 正则匹配
    a=re.search(r'[A-Z0-9]{6,13}-?[0-9]{1,10}',EAS_list[i,5]).group()
    
    7 日期计算
        d1 = datetime.datetime(int(finally_list[i,11][0:4]),int(finally_list[i,11][5:7]),int(finally_list[i,11][8:]))
        d2 = datetime.datetime(self.y,self.m,self.d)
        finally_list[i,12]=(d2 - d1).days
    
    8 删除文件下的所有含有中文的文件名称的文件
    import re
    import os
    
    #默认路径
    file_dir=r'C:UsersuserDesktop测试'
    file_list=[]
    flie_CN_list=[]
    last_list=[]
    dirlist=[]
    #读取默认路径下的所有文件夹路径和文件
    for root, dirs, files in os.walk(file_dir):   
        file_list.extend(files)
        dirlist.append(root) 
    #匹配中文
    zhmodel = re.compile(u'[u4e00-u9fa5]')
    #如果匹配到文件名中有中文则放入列表
    for i in range(0,len(file_list)):
        match = zhmodel.search(file_list[i])
        if match:
            flie_CN_list.append(file_list[i])
    
    #将读出的文件路径和存在中文的文件名进行拼接
    for i in range(0,len(flie_CN_list)):
        for x in dirlist:
            path = os.path.join(x,flie_CN_list[i])
            if os.path.isfile(path):
                last_list.append(path)
    
    print(last_list)
    #删除拼接好的含中文的文件名的文件
    for i in last_list:
        os.remove(i)
    
    
    删除进程
    import os
    os.system("taskkill /F /IM javaw.exe")
    总览

     8excell表格是空值的办法,以及如何将两个列表融合为一个字典

    import pandas as pd
    df=pd.read_excel(io='',sheet_name='')
    1、用数字 0 填充空值:
    df.fillna(value=0)
    2、使用列 prince 的均值对 NA 进行填充:
    df['prince'].fillna(df['prince'].mean())
    3、清除 city 字段的字符空格:
    df['city']=df['city'].map(str.strip)
    4、大小写转换:
    df['city']=df['city'].str.lower()
    5、更改数据格式:
    df['price'].astype('int')
    6、更改列名称:
    df.rename(columns={'category': 'category-size'})
    7、删除后出现的重复值:
    df['city'].drop_duplicates()
    8、删除先出现的重复值:
    df['city'].drop_duplicates(keep='last')
    9、数据替换:
    df['city'].replace('sh', 'shanghai')
    
    10把两个列表融合为一个字典
    l_1=['name','age','sex']
    l_2=['andy',11,'male']
    dict(zip(l_1,l_2))
    View Code

     9 python 获取excel文件的所有sheet名字

     

    当一个excel文件的sheet比较多时候, 这时候需要获取所有的sheet的名字. 

    xl = pd.ExcelFile('foo.xls')
    
    xl.sheet_names  # see all sheet names
    
    xl.parse(sheet_name)  # read a specific sheet to DataFrame

    也可以直接读取所有的sheet,  将sheetname设置为None.  这时候得到的是一个dict结果.

    df = pandas.read_excel("/yourPath/FileName.xlsx", None);

    "df" are all sheets as a dictionary of DataFrames, you can verify it by run this:

    df.keys()

    邮件发送

    #需要导入的包
    import time
    import pdb
    from ubpa.ilog import ILog
    from ubpa.base_img import *
    import getopt
    from sys import argv
    import sys
    from sys import argv
    from ubpa.base_img import *
    from ubpa.ilog import ILog
    from ubpa.itools import rpa_import
    from ubpa.itools import rpa_import
    GlobalFun = rpa_import.import_global_fun(__file__)
    import getopt
    import pdb
    import sys
    import time
    import ubpa.iautomation as iautomation
    import ubpa.ibox as ibox
    import ubpa.iexcel as iexcel
    import ubpa.ikeyboard as ikeyboard
    import ubpa.ioutlook as ioutlook
    import ubpa.itools.rpa_str as rpa_str
    import ubpa.iwin as iwin
    邮件发送代码

    老数据清理

    清理文件夹,将老数据的文件转移到历史文件夹下面

    old_data=r'D:Parameter_modificationparameter_dataDataclient_data'
    def now_date(old_data):
        # 现在的日期
        now_time = time.strftime('%Y-%m-%d_%H%M%S', time.localtime(time.time()))
        # 历史文件夹
        history_file = 'D:/Parameter_modification/parameter_data/History' + '/' + now_time
        # 判断history文件夹存不存在
        if not os.path.exists(history_file):
            # 创建历史
            os.mkdir(history_file)
        # move_file就是要移动的文件夹
        # 判断历史文件夹下main有没有存在将要从client_data下移动过来的文件
        for move_file in glob.glob(old_data + '\' + '*'):
            # print(move_file)
            # h_l列表里面是当天历史文件夹下main的文件
            h_l = glob.glob(history_file + '\' + '*')
            l2 = []
            # 循环这个列表
            for i in h_l:
                l2.append(i[-4:])
                # 要是client_data文件夹里面的文件在当天历史文件夹里面
            if move_file[-4:] in l2:
                os.system('rd/s/q ' + move_file)
                print('删除了%s' % move_file)
    
            else:
                shutil.move(move_file, history_file)
    老数据的清理

    发送邮件的基本信息及过滤

    # 读取整列
    # 获取邮件的发送人员
    address = iexcel.read_col(path='D:/Parameter_modification/parameter_data/Data/mail/send_mail_people.xlsx')
    # 读取整列
    # 获取本地的邮箱账号
    mail_username = iexcel.read_col(path='D:/Parameter_modification/parameter_data/Data/mail/send_mail_people.xlsx',
                                    cell='B1')
    # 读取整列
    # 获取邮箱的主题
    
    topic_filtering = iexcel.read_col(path='D:/Parameter_modification/parameter_data/Data/mail/send_mail_people.xlsx',
                                      cell='C1')
    
    # 获取到的数据进行过滤
    address = address[1:]
    mail_username = mail_username[1:2][0]
    topic_filtering = topic_filtering[1:2][0]
    print(address, mail_username, topic_filtering)
    View Code

    接收邮件

    # 接收outlook邮件
    #邮件的接收人mail_account,邮件的发送者sender_filter,邮件主题subject_filter,    变为已读状态mark_as_read,收取未读状态only_unread,又将附件存储地址attachment_path
    mail_receving = ioutlook.recv_outlook(mail_account=mail_username, sender_filter=addr, subject_filter=topic_filtering,mark_as_read=False, only_unread=True,          attachment_path='D:/Parameter_modification/parameter_data/Data/mail/mail_rece_file/')
    接收邮件配置

    数据过滤

    将附件中的文件转移到新的文件夹中本分类

    def mail_guolv(mail_recv_path, client_data):
        # 邮件存储路径
    
        # ll就是文件夹下面的所有的文件名字,是个列表
        l1 = glob.glob(mail_recv_path + '\' + '*')
        # 定义三个列表对接受到的邮件进行过滤,先写3个,后面再有的书数据再进行添加l_交易
        l_TFG50 = []  # 对公大额存单系统参数
        l_T3280 = []  # 对私大额存单系统参数
        l_TBC13A = []  # 新安享赢产品参数表(新增)
    
        # l1=os.listdir(mail_recv_path)
        for i in l1:
            # print(i)
            if i.endswith('.xlsx' or 'xls'):
                # print(i)
                if '对公大额存单系统参数' in i:
                    l_TFG50.append(i)
                elif '对私大额存单系统参数' in i:
                    l_T3280.append(i)
    
                elif '新安享赢产品参数表' in i:
                    l_TBC13A.append(i)
        # 将要创建的文件夹
        path_TFG50 = client_data + '\' + 'TFG50'
        path_T3280 = client_data + '\' + 'T3280'
        path_TBC13A = client_data + '\' + 'TBC13A'
        print(path_TFG50)
        print(path_T3280)
        print(path_TBC13A)
        # 使用os.mkdir创建文件夹
        if not os.path.exists(path_TFG50):
            os.mkdir(path_TFG50)
        if not os.path.exists(path_T3280):
            os.mkdir(path_T3280)
        if not os.path.exists(path_TBC13A):
            os.mkdir(path_TBC13A)
        for l_t in l_TFG50:
            if os.path.isfile(l_t):
                print(l_t)
                # 使用move就是移动,而copy就是拷贝
                shutil.move(l_t, path_TFG50)
                # shutil.copy(l_t,path_TFG50)
        for l_t in l_T3280:
            if os.path.isfile(l_t):
                print(l_t)
                # 使用move就是移动,而copy就是拷贝
                shutil.move(l_t, path_T3280)
                # shutil.copy(l_t,path_T3280)
    
        for l_t in l_TBC13A:
            if os.path.isfile(l_t):
                print(l_t)
                # 使用move就是移动,而copy就是拷贝
                shutil.move(l_t, path_TBC13A)
                # 就算里面有也不会覆盖
            # shutil.copy(l_t,path_TBC13A)
        #收到的文件都分类好了之后把剩下的脏数据进行删除处理
        for qt in glob.glob(mail_recv_path +'\'+'*'):
            os.remove(qt)
    View Code

    将分好类的文件夹进行数据的处理(过滤及分类)

    # 过滤TFG50文件
    def filteration_TFG50(document):
        # 先定义一个字典,然后作为返回值
        dic = {'trade name': 'TFG50', 'success': None, 'failed': None}
        fail = []
        # 客户端需要的数据
        client_datas = []
        # TFG50表格路径
        # print(document)
    
        # document就是data文件夹下TFG50的路径
        # 获取文件夹下所有的文件,是个列表
        file_names = os.listdir(document)
        # print(file_names)
        # 所有的TFG50表格文件
        for file_name in file_names:
            # 看列表中是否有~开头的,有的话给过滤掉
            if file_name.startswith('~'):
                continue
            file_name = document + '/' + file_name
            # print(file_name,'你好')
    
            try:
                # 判断是否是文件
                if os.path.isfile(file_name) == True:
                    if '-' in file_name:
                        # 将文件切割
                        l = file_name.split('-')
                        # 要改的新的文件名
                        file_name_new = l[0] + ".xlsx"
                        # 修改文件名(D:Parameter_modificationDataFG50对公大额存单系统参数20190715.xlsx)
                        os.rename(os.path.join(document, file_name), os.path.join(document, file_name_new))
                        print('TFG50文件' + document + file_name_new)
                        file_name_new = document + file_name_new
                    else:
                        file_name_new = file_name
                    # file_name_new就是TFG50下面的所有的文件详细路径
                    print(file_name_new)
                    # 获取表格的sheet名字
                    sheet_names = pd.ExcelFile(file_name_new).sheet_names
                    for sheet_name in sheet_names:
                        print(sheet_name)
                        # 读取excel表格
                        df = pd.read_excel(io=file_name_new, sheet_name=sheet_name)
                        # 将nan编程替换成空字符串
                        df = df.fillna(value='')
                        # 读取表格的c列和D列
                        dc_d = df.iloc[0:, 2:4]
                        # 就是字段的c列和d列组成的列表
                        l_c_d = dc_d.values.tolist()
                        # print(l_c_d)#输出当前工作表中的字段和信息
    
                        # 循环启动输出客户类型和参数值,每一个line就是类似于这个['操作标志', 'I'],['发行年度', '2019']
                        sign = 100  # 设置一个标志值,如果sign=line[0]说明该数据错误,应该记录台账,不再往下进行
                        for line in l_c_d:
                            #就是一些数据的比对,不能给你们看
                            pass
    
                        if sign == 100:
                            print('文件 >>%s 中 >>%s工作表通过验证' % (file_name_new, sheet_name))
                            # 创建两个空列表,然后组合成字典
                            l_key = []
                            l_value = []
                            for line in l_c_d:
                                l_key.append(line[0])
                                l_value.append(line[1])
                            '''
                            client_data是往客户端传递的数据
                            '''
    
                            client_data = dict(zip(l_key, l_value))
                            client_datas.append(client_data)
                        else:
                            # 现在的时间
                            now_time = time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(time.time()))
                            # 台账信息
                            mess = '文件:%s--工作表:%s--出错字段:%s--时间:%s' % (file_name_new, sheet_name, sign, now_time)
                            print(mess)
                            # 将将出错的台账信息放到列表中
                            fail.append(mess)
    
            except Exception:
                pass
        # print(fail,client_datas)
        dic['success'] = client_datas
        dic['failed'] = fail
        return dic
    View Code

    就这样得到了一个大的列表,列表里面是字典,几个交易就是几个字典,字典里面的数据就是{'success': None, 'failed': None}类似与这种样式的

    这样我们的数据就处理好了,之后就可以进行数据的录入,替换等一些简单的操作了

  • 相关阅读:
    JDOJ 2197: 校门外的树
    简单线段树知识点详解
    求GCD(最大公约数)的两种方式
    USACO Buying Feed, II
    USACO Dueling GPS's
    USACO Milking Cows
    NOIP 2014 比例简化
    USACO Clumsy Cows
    JDOJ 1140: 完数
    NOIP 2008 火柴棒等式
  • 原文地址:https://www.cnblogs.com/ouyang99-/p/11168684.html
Copyright © 2011-2022 走看看