用Python语言分析银行自助设备交易流水文件.docx
《用Python语言分析银行自助设备交易流水文件.docx》由会员分享,可在线阅读,更多相关《用Python语言分析银行自助设备交易流水文件.docx(8页珍藏版)》请在冰豆网上搜索。
用Python语言分析银行自助设备交易流水文件
用Python语言分析银行自助设备交易流水文件
作者:
何惠英付少波安居付兰芳
来源:
《现代电子技术》2010年第05期
摘要:
无人值守银行自助设备的运行状况是一项非常重要的内容,维护者必须能够及时分析并处理设备所出现的各种故障。
自助设备交易流水文件详细记录了设备的运行状况,为了分析该文件,基于当前流行的Python语言,并配合wxPythonGUI包为软件开发平台,开发了自助取款设备运行状况分析程序,该软件具有开发周期短、界面友好、操作简单的优点。
关键词:
python;流水记录文件;分析工具;ATM
中图分类号:
TP311文献标识码:
A
文章编号:
1004-373X(2010)05-131-04
JournalLogFilesofATMBasedonPython
HEHuiying,FUShaobo,ANJu,FULanfang
(AcademyofMilitaryTransportation,Tianjin,300161,China)
Abstract:
ATM′srunningisveryimportant,vindicatormustanalyseanddealwitheachfaultintimeandgenerally.ATM′srunningprogramisdeveloped,basedonpopularPythonlanguagewithwxPythonGUItoolkit.Thismethodhasshortdevelopmentperiodandfriendlyinterfaceandsimpleoperation.
Keywords:
python;journallogfiles;analysistool;ATM
银行自助设备为用户的银行交易提供更多的方便,可以24h为用户提供服务。
目前随着银行卡发行量的增多,银行自助取款设备的使用频率在逐步提高。
但因自助取款设备无人值守的特点,设备的运行状况便成了一个非常重要的关注点。
目前除了实时的监控系统之外,流水记录文件的分析便是机器运行状况的主要参考内容。
从机器流水记录中可以分析机器的运行状况、各周期交易量、正常及异常的交易明细等。
大多自助设备的交易量很大,每日可达几百笔业务,这样,多台机器经过几个周期运行之后的数据量很大,这无疑给设备的故障分析工作带来了很大的难度。
因此,专为流水记录文件写一个分析软件便显得非常迫切。
基于该背景,介绍如何使用Python语言开发分析流水记录文件工具的过程。
1Python语言介绍
Python是免费的解释性语言[1],具有面向对象的特性,可以运行在多种操作系统之上,它继承了传统编译语言的强大性和通用性,同时也借鉴了简单脚本和解释语言的易用性。
Python具有清晰的结构、简洁的语法以及强大的功能,可以完成从文本处理到网络通信等各种工作,并且其自身已经提供了大量的模块来实现各种功能,除此以外还可以使用C/C++来扩展,甚至还可以将其嵌入到其他语言中。
Python语言特点[2]:
(1)自由软件:
遵循GPL协议,不需要支持任何费用,也不用担心版权问题,可阅读其源代码。
(2)跨平台:
Python最初是在MAC操作系统下实现的,有很强的移植性,可运行在多种流水行操作系统之上,如Linux,Windows,MAC等。
(3)功能强大:
可以使用在多个领域,如系统编程,帮助用户完成繁琐的日常工作;科学计算,它简洁的语法可以像使用计算器一样来完成科学计算;快速原型,它省去了编译调试的过程,可以快速地实现系统原形;Web编程,使用它可以编写CGI,而现在流行的Web框架也可以使用Python实现。
(4)可扩展:
通过使用C/C++可以对Python进行扩展;Python也可以嵌入到C/C++编写的程序之中。
在某些情况下,它可以作为动态链接库的替代品在C/C++中使用。
(5)易学易用:
语法简单;使用变量时无需事先声明;使用Python不必关心内在的使用,它会自动地分配、回收内存;Python提供了强大的内置对象和方法,如本文使用的open()方法;使用Python可以减少其他编程语言的复杂性,例如在C语言中使用数十行代码实现的排序,而在Python中,可以使用列表的排序函数轻易完成。
2流水记录文件特性
流水记录文件是记录机器运行状态的log文件,包含机器运行时的各种硬件状态、网络状态、用户操作记录、管理员操作记录等内容,是分析机器运行状况具的重要依据之一。
(1)文件类型:
以日期命名的纯文本格式文件。
(2)文件内容:
交易时机器状态及相关交易信息;
操作员对机器的操作记录;
待机时机器当前状态;
网络链接状态;
机器重启时的相关信息等。
(3)文件关键字:
插卡日期、卡号、交易类别、交易金额、交易成功标志、交易失败标志、失败原因、网络故障等。
(4)文件位置:
位于ATM机器硬盘内,部分文件同步于银行后台主机。
3基于Python语言开发的分析流水记录文件工具
3.1开发原理
通过Python语言的内置函数open()来打开流水文件[3],返回一个文件对象,然后用for循环遍历这个流水文件对象,通过字符串匹配的方式来查找主要关键字并保存相关信息,然后计算生成所需要的各种字符串信息或列表供分析使用。
3.2环境介绍
开发语言:
Python2.5.4
界面框架:
wxPython2.8-win32-unicode-2.8.10.1-py25;
运行环境:
所有Unix衍生系统(Linux,MacOSX,Solaris,FreeBSD等),Win32家族(WindowsNT,2000,XP等),
早期平台:
MacOS8/9,Windows3.x,DOS,OS/2,AIX[4]。
3.3程序实现
该程序采用面向对象的编程方法来对各个模块的功能进行实现,JrnAnalyse.pyw来初始化程序,并调用mainframe模块进行程序界面显示,在mainframe模块中调用jrn模块进行流水文件分析,jrn模块返回分析结果给mainframe模块进行显示或是存盘。
程序框图如图1所示。
3.3.1Python实现处理文件
文件也可以看作是Python中的数据类型。
当使用Python的内置函数open打开一个文件时,返回一个文件对象。
其原型如下所示[5]:
open(filename,mode,bufsize)
其参数含义如下:
filename:
要打开的文件名。
mode:
可选参数,文件打开模式。
bufsize:
可选参数,缓冲区大小。
其中mode可以是″r″表示读方式打开文件;″w″表示以写方式打开文件;″b″表示以二进制方式打开文件。
图1程序框图
open()成功执行并返回一个文件对象之后,所有对该文件的后续操作都将通过这个“句柄”进行。
文件方法可以分为四类:
输入,输出,文件内移动,以及杂项操作。
以下介绍要用到的几个最基本的方法:
file.write():
向文件中写入字符串,使用此方法来保存成功交易明细或疑问帐信息[6]。
file.close():
关闭打开的文件
对所打开的文件对象进行遍历来查找所需要的信息,是进行流水记录分析的重要过程,示例如下:
file=open(″filename″,″rU″)
#U参数可解决文件结束符不统一的问题,如\\r会替换为\\n,这样在用for循环的时候就统一了行结束标志。
forlineinfile:
#使用for循环对文件对象file进行遍历,line为filename中的每一行数据。
printline#此例为打印line数据到屏幕
3.3.2wxPython实现GUI界面显示
wxPython是跨平台工具库wxWidgets的封装。
wxWidgets库是由C++编写的,它类似于Windows的MFC[7]。
wxWidgets提供了对多种操作系统的支持。
由于它良好的可移植性,wxPython也具备了跨平台的能力。
在Python中使用wxPython可以编写具有跨平台能力的GUI脚本。
这里介绍能够显示图形界面的几个主要步骤:
#-*-coding:
utf-8-*-
importwx
classMyApp(wx.App):
defOnInit(self):
frame=wx.Frame(parent=None,title=′Hello,wxPython!
′)
frame.Show()
returnTrue
app=MyApp()
app.MainLoop()
开头指定使用utf-8字符编码,可显示中文字符串。
首先导入wx模块,即wxPython。
然后继承wx模块中的App类创建了一个MyApp类[8]。
在Myapp类中重载了OnInit方法。
OnInit方法是窗口初始化的一部分,在该方法中创建了一个窗口框架,并显示该窗口。
一般来讲,OnInit方法最后应返回True。
最后两行,将MyApp类实例化成app对象,然后调用其MainLoop方法进入消息循环。
3.3.3程序结构
(1)程序启动文件:
JrnAnalyse.pyw
#-*-coding:
utf-8-*-
″″″
atmtool.py:
Atoolforanalyseatmjounarlfiles#文件注释
″″″
importwx#导入wxpython模块
importmainframe#导入mainframe模块
classAtmApp(wx.App):
#定义启动类
def_init_(self,redirect=False,filename=None):
#重载生成对象时初始化方法
wx.App._init_(self,redirect,filename)
defOnInit(self):
#重载窗口初始化方法
self.main=mainframe.CreatMainframe(None)
self.main.Show()
self.SetTopWindow(self.main)
returnTrue
if_name_==″_main_″:
#作为独立程序启动
application=AtmApp()
application.MainLoop()
(2)界面显示模块:
mainframe.py
在该模块中定义了各种显示组件、界面组件操作方法;各方法列表如下:
def_init_(self,parent):
#定义并初始化各种显示组件
defopenDir(self):
#定义打开打开流水文件方法
defrunJrn(self):
#定义调用流水分析模块方法
defOn_Quit(self,event):
#定义退出程序方法
defOn_Help(self,event):
#定义帮助文件方法
defOn_About(self,event):
#定义关于程序方法
defOnItemSelected(self,event):
#定义点击列表方法
defgetColumnText(self,index,col):
#定义点击选择列表内容方法
defscroll2line(self,current_page):
#定义定位到疑问流水位置的方法
defOnOkTrans(self,event):
#定义保存成功交易方法
(3)流水分析模块:
jrn.py
该模块进行每个流水记录文件的分析工作。
defget_date_card(self,line,jrnfp)[9]:
#定义获取用户交易日期卡号方法
defget_cwd_amount(self,line):
#定义获取用户取款交易金额方法
defget_dep_amount(self,line,jrnfp)#定义获取用户存款交易金额方法
deftotal(self,jrns):
#定义计算多周期交易汇总信息方法
defquestion(self,jrns):
#定义获取疑问交易方法
defhardware(self,jrns):
#定义获取机器硬件异常方法
if_name_==″_main_″:
#流水模块自省语句判断
下面将主要流水模块中的分析情况举例说明如下:
获取用户交易日期和卡号例子:
defget_date_card(self,line,jrnfp):
date=″″
card_no=″″
if′=AcceptCard′inline:
#获取插卡日期
date=line
cwd_amount=″″#如果插卡则将cwd_amount清空
elif′CardType:
′inline#获取插卡卡号
card_no=line#将卡号保存在card_no变量中
returndate,card_no#返回插卡日期和卡号
获取用户取款交易金额例子:
defget_cwd_amount(self,line,jrnfp):
if′-CWDAmount:
′inline:
#如果关键字-CWDAmount在本行中
temp=line.split()[1]
amount=int(temp.split(′:
′)[1])#将取款金额字符串转成整形后保存
returnamount#返回取款金额
获取用户取款成功标志例子:
if′WITHDRAWALOK′inline[10]:
#如果取款成功标志在本行中
cwd_ok_amount+=amount#累加取款金额
cwd_ok_num+=1#累加取款笔数
money_taken=True#只要条件匹配一次,就将取钞标志置真
succeed_trans+=(date.strip()+″″+card.strip()+″″+str(cwd_amount)+″cwdsucceed\\n″)#保存成功交易明细
获取用户存款交易金额例子:
defget_dep_amount(self,line,jrnfp):
dep_amount=0
if′Amount:
′inlineand′TELLER:
′inline:
#如果存款交易关键字在本行中
temp=line.split()[1]
dep_amount=int(temp.split(′:
′)[1])#将存款金额字符串转成整形后保存
returndep_amount#返回存款金额
获取用户存款成功标志例子:
if″CASHINNOTESOK″inline:
#如果成功取款标志在本行中
dep_ok_amount+=dep_amount#累加存款金额
dep_ok_num+=1#累加存款笔数
cash_stored=True#只要条件匹配一次,就将存钞标志置真
succeed_trans+=(date.strip()+″″+card.strip()+″″+str(dep_amount)+″depsucceed\\n″)
#保存成功交易明细
获取管理员清机加钞标志:
if′---RefillCash---′inline:
#获取加钞标志
Heredowhatyouwant
程序运行示例:
图2是打开了多个流水记录文件后程序的运行显示效果图。
上左:
疑问交易明细上右:
疑问交易概览
下左:
各周期交易汇总下右:
硬件关键信息
图2运行显示效果图
4结语
本文所述的基于Python语言的流水分析工具在分析自助设备运行状况中得到了很好的应用,大大减少了
设备维护者的工作量。
在一个交易周期还未结束时,就可提前发现已经出现的疑问帐务,对于由于网络问题而导致服务器记录缺失现象有很大帮助,同时也提高了对客户的服务水平。
基于此方法,还可以用Python语言编写分析工具来分析其他领域的记录文件。
参考文献
[1]MarkLutz.LearningPython[M].3版.南京:
东南大学出版社,2008.
[2][美]WesleyJChun.Python核心编程[M].2版.宋吉广,译.北京:
人民邮电出版社,2007.
[3]孙广磊.征服Python——语言基础与典型应用[M].北京:
人民邮电出版社,2007.
[4]NOELRAPPIN.wxPythoninAction[M].ManningPublicationsCo.,2006.
[5]AlexMartelli.PythoninaNutshell[M].2ndEdition.O′Reilly,2006.
[6]MagnusLieHetland.BeginningPythonFromNovicetoProfessional[M].SecondEdition.2008.
[7]TarekZiadé.ExpertPythonProgramming[M].PacktPublishingLtd.2008.
[8]JimKnowlton.Python?
:
Create-Modify-Reuse[M].WileyPublishingInc..2008.
[9]MarkLutz.ProgrammingPython[M].3rdEdition.O′Reilly,2006.
[10]DavidMertz.TextProcessinginPython[M].AddisonWesley,2003.