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}类似与这种样式的

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

  • 相关阅读:
    PAT (Advanced Level) Practice 1054 The Dominant Color (20 分)
    PAT (Advanced Level) Practice 1005 Spell It Right (20 分) (switch)
    PAT (Advanced Level) Practice 1006 Sign In and Sign Out (25 分) (排序)
    hdu 5114 Collision
    hdu4365 Palindrome graph
    单链表查找最大值、两个递增的链表合并并且去重
    蓝桥杯-最短路 (SPFA算法学习)
    蓝桥杯-最大最小公倍数
    Codeforces-470 div2 C题
    蓝桥杯-地宫取宝
  • 原文地址:https://www.cnblogs.com/ouyang99-/p/11168684.html
Copyright © 2011-2022 走看看