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:\Users\Kun.Shi\Desktop\Excel\3.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:\Users\Kun.Shi\Desktop\张老师\系统报表\系统报表\恒运宝报表\1.csv')
csv = pd.read_csv(f, encoding='utf-8')
csv.to_excel(r'C:\Users\Kun.Shi\Desktop\张老师\系统报表\系统报表\恒运宝报表\1.xlsx', sheet_name='data')

2.6 判断是否存在在创建文件
import os
path=[r'C:\Users\user\Desktop\对账表\张雯',r'C:\Users\user\Desktop\对账表\陈培君',r'C:\Users\user\Desktop\对账表\朱佳莲',r'C:\Users\user\Desktop\对账表\王欣元',r'C:\Users\user\Desktop\对账表\胥文焉']
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:\Users\Kun.Shi\Desktop\iExcel\1恒信'
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:\Users\Kun.Shi\Desktop\EAS_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:\Users\Kun.Shi\Desktop\EAS_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:\Users\user\Desktop\测试'
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_modification\parameter_data\Data\client_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_modification\Data\FG50\对公大额存单系统参数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}类似与这种样式的

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

posted on 2019-07-11 10:59  Andy_ouyang  阅读(823)  评论(0编辑  收藏  举报