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项目所遇知识点的更多相关文章

  1. RPA项目POC指南:概念、步骤与技巧

    "为什么部署RPA前要进行POC?RPA不是开箱即用吗?" 其实,RPA的实施并非总是一帆风顺,"碰坑"在所难免. 据安永报告显示,30%至50%的初始RPA项 ...

  2. ASP.NET MVC开发:Web项目开发必备知识点

    最近加班加点完成一个Web项目,使用Asp.net MVC开发.很久以前接触的Asp.net开发还是Aspx形式,什么Razor引擎,什么MVC还是这次开发才明白,可以算是新手. 对新手而言,那进行A ...

  3. 基于spring框架的jt项目分页查询知识点(二)

    知识点汇总 1. 日志记录方法 private Logger log= Logger.getLogger(SysLogServiceImpl.class.getName()); 记录SysLogSer ...

  4. Eclipse 开发WEB项目所遇问题 WebContent WebRoot

    原文:http://blog.sina.com.cn/s/blog_525960510100jo0j.html 最近在做Web 项目时,新建了一个WEB 项目,如webdemo,eclipse默认的b ...

  5. 基于spring框架的jt项目分页查询知识点(一)

    知识点汇总(一) 1. 点击事件函数 $(function(){ //事件注册,(表示在#pageId对应容器对象的相关子元素中注册click事件) $("#pageId").on ...

  6. django项目所遇问题总结

    2. 关于设置static静态文件,样式失效问题 原因: 可能开启多个端口号,页面显示访问的不是已经设置了static的模板,所以,样式没有显示 3. models模型中gender字段的选择设置 c ...

  7. spring+springMVC+mybatis , 项目启动遇坑

    github上找的框架组合例子 结合自己的数据库作为新项目开发. 但是项目启动时,tomcat启动失败: 检查不出错误. 于是改换maven引入jetty插件来启动项目, 结果在未改动的任何代码的情况 ...

  8. 二阶段项目所遇问题 如何实现php向js传输数据

    首先当前页面做了一个双处理的界面,就是有PhP也有JS的处理界面. 上一个传值界面是一个PHP的传值,结果,在当前页面的JS中也要用到上一界面传的值,这时发现,PHP与JS就像是两个互相孤立的小岛,根 ...

  9. Android项目打包遇com.android.builder.internal.aapt.v2.Aapt2Exception: AAPT2 error: check logs for details

    查了网上很多处理都是在项目的gradle.properties中添加下面的配置,再编译就通过了: android.enableAapt2=false

随机推荐

  1. 在服务器上安装并配置JDK1.8

    参考链接:https://blog.csdn.net/qq_40958000/article/details/83996912

  2. jQuery - lable 取值、赋值

    取值 var val = $("#breakfastMonday").html(); 赋值 $("#breakfastMonday").html("v ...

  3. 监听Ueditor的 iframe中的按键,按键组合事件(Ctrl+s)

    个人博客 地址:https://www.wenhaofan.com/a/20190716214214 监听按键事件 ueditor.ready(function() {     UE.dom.domU ...

  4. GitKraken 快速配置 SSH Key

    快速使用 GitKraken 配置SSH keys git是现在最流行的版本管理工具,应用范围非常广泛,推荐一款git的可视化工具,这款 工具特别方便 它的官方如下https://www.gitkra ...

  5. 嵊州D6T2 城市 city

    城市 city [问题描述] 众所周知,why 是czyz 王国的国王. czyz 王国一共有n 个城市,每个城市都有一条道路连向一个城市(可能连向这个城市自己). 同时,对于每一个城市,也只有一条道 ...

  6. vnode

    获取vnode对象 vm.$slots对象下的所有值 vm.$scopedSlots对象的值返回一个函数,该函数执行后返回vnode对象 directives自定义指令中钩子函数的参数3和参数4,例如 ...

  7. PAT (Basic Level) Practice (中文)1043 输出PATest (20 分)

    给定一个长度不超过 1 的.仅由英文字母构成的字符串.请将字符重新调整顺序,按 PATestPATest.... 这样的顺序输出,并忽略其它字符.当然,六种字符的个数不一定是一样多的,若某种字符已经输 ...

  8. 2级搭建类204-Oracle 12cR2 SI ASM 图形化搭建(RHEL7.6)

    红帽RHEL 7.6上搭建Oracle 12cR2 ASM单实例 我给你们说,不是自家的产品,那贼麻烦,你是不是觉得在 红帽 7.6 上搞 12c ASM 觉得应该/好像/可能/或许/貌似/大概/也许 ...

  9. vue 脚手架使用路由

    概念: 后端路由: 后端处理URL和页面之间的映射关系 前端发展阶段: 1.后端渲染阶段(以jsp,php为代表,其特点为html代码和后端语言代码混写在一起 2.前后端分离阶段(随着ajax的兴起, ...

  10. grep/sed/awk命令查看指定时间段的日志

    *grep命令 今天遇到研发要求查询定时任务(elastic-job)在14:00-14:40的日志,使用grep命令很方便: 命令: grep '时间' '日志文件名 ' 1.例如查询2020-02 ...