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)
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))
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)
# 接收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)
# 过滤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
就这样得到了一个大的列表,列表里面是字典,几个交易就是几个字典,字典里面的数据就是{'success': None, 'failed': None}类似与这种样式的