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)
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))
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)
接收邮件
# 接收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_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
就这样得到了一个大的列表,列表里面是字典,几个交易就是几个字典,字典里面的数据就是{'success': None, 'failed': None}类似与这种样式的
这样我们的数据就处理好了,之后就可以进行数据的录入,替换等一些简单的操作了
RPA项目所遇知识点的更多相关文章
- RPA项目POC指南:概念、步骤与技巧
"为什么部署RPA前要进行POC?RPA不是开箱即用吗?" 其实,RPA的实施并非总是一帆风顺,"碰坑"在所难免. 据安永报告显示,30%至50%的初始RPA项 ...
- ASP.NET MVC开发:Web项目开发必备知识点
最近加班加点完成一个Web项目,使用Asp.net MVC开发.很久以前接触的Asp.net开发还是Aspx形式,什么Razor引擎,什么MVC还是这次开发才明白,可以算是新手. 对新手而言,那进行A ...
- 基于spring框架的jt项目分页查询知识点(二)
知识点汇总 1. 日志记录方法 private Logger log= Logger.getLogger(SysLogServiceImpl.class.getName()); 记录SysLogSer ...
- Eclipse 开发WEB项目所遇问题 WebContent WebRoot
原文:http://blog.sina.com.cn/s/blog_525960510100jo0j.html 最近在做Web 项目时,新建了一个WEB 项目,如webdemo,eclipse默认的b ...
- 基于spring框架的jt项目分页查询知识点(一)
知识点汇总(一) 1. 点击事件函数 $(function(){ //事件注册,(表示在#pageId对应容器对象的相关子元素中注册click事件) $("#pageId").on ...
- django项目所遇问题总结
2. 关于设置static静态文件,样式失效问题 原因: 可能开启多个端口号,页面显示访问的不是已经设置了static的模板,所以,样式没有显示 3. models模型中gender字段的选择设置 c ...
- spring+springMVC+mybatis , 项目启动遇坑
github上找的框架组合例子 结合自己的数据库作为新项目开发. 但是项目启动时,tomcat启动失败: 检查不出错误. 于是改换maven引入jetty插件来启动项目, 结果在未改动的任何代码的情况 ...
- 二阶段项目所遇问题 如何实现php向js传输数据
首先当前页面做了一个双处理的界面,就是有PhP也有JS的处理界面. 上一个传值界面是一个PHP的传值,结果,在当前页面的JS中也要用到上一界面传的值,这时发现,PHP与JS就像是两个互相孤立的小岛,根 ...
- Android项目打包遇com.android.builder.internal.aapt.v2.Aapt2Exception: AAPT2 error: check logs for details
查了网上很多处理都是在项目的gradle.properties中添加下面的配置,再编译就通过了: android.enableAapt2=false
随机推荐
- 数据库MySQL之show processlist
在实际项目开发中,如果我们对数据库的压力比较大,比如有大批量的查询或者插入等sql,尤其是多线程插入等情况,针对部分执行比较慢的sql,我们可以将其kill掉,常用的一个命令就是show proces ...
- Chapter1 递归与递推
Chapter 1 递归与递推 时间复杂度(转载自yxc大佬) 一般ACM或者笔试题的时间限制是1秒或2秒. 在这种情况下,C++代码中的操作次数控制在 107107 为最佳. 下面给出在不同数据范围 ...
- [CF1311E] Construct the Binary Tree - 构造
Solution 预处理出 \(i\) 个点组成的二叉树的最大答案和最小答案 递归做,由于只需要构造一种方案,我们让左子树大小能小就小,因此每次从小到大枚举左子树的点数并检验,如果检验通过就选定之 现 ...
- demo 基于html css 实现小米官网部分内容搭建
文件夹目录 mi-site-----------主文件夹 css------------css文件文件夹 fonts.css---矢量图标css index.css---主页面样式css reset. ...
- mac 非安全模式 开启
https://github.com/callmelaoda/communicate/issues/8 open -a Google\ Chrome --args --disable-web-secu ...
- 微信小程序调起支付API
官方文档: https://pay.weixin.qq.com/wiki/doc/api/wxa/wxa_api.php?chapter=7_7 https://developers.weixin.q ...
- ubantu crontab定时任务设置
Lynx浏览器安装.安装命令:sudo apt-get install lynx.打开终端输入:crontab -e若初次执行会出现以下(选择编译器,一般选4(Vim))Select an edito ...
- IntelliJ Pycharm 2019年最新版 安装激活教程【最强,可用至2089、2100年】
本文为2019年Pycharm最新版安装永久激活教程 PyCharm 2019.3 (Professional Edition) ①IntelliJ Pycharm 2019.3安装永久破解[最强] ...
- Power Strings[poj2406]题解
Power Strings Description - Given two strings a and b we define ab to be their concatenation. For ex ...
- jQuery---淘宝精品案例
淘宝精品案例 <!DOCTYPE html> <html> <head lang="en"> <meta charset="UT ...