摘 要:無人值守銀行自助設(shè)備的運(yùn)行狀況是一項(xiàng)非常重要的內(nèi)容,維護(hù)者必須能夠及時(shí)分析并處理設(shè)備所出現(xiàn)的各種故障。自助設(shè)備交易流水文件詳細(xì)記錄了設(shè)備的運(yùn)行狀況,為了分析該文件,基于當(dāng)前流行的Python語言,并配合wxPython GUI包為軟件開發(fā)平臺(tái),開發(fā)了自助取款設(shè)備運(yùn)行狀況分析程序,該軟件具有開發(fā)周期短、界面友好、操作簡單的優(yōu)點(diǎn)。
關(guān)鍵詞:python;流水記錄文件;分析工具;ATM
中圖分類號(hào):TP311文獻(xiàn)標(biāo)識(shí)碼:A
文章編號(hào):1004-373X(2010)05-131-04
Journal Log Files of ATM Based on Python
HE Huiying,F(xiàn)U Shaobo,AN Ju,F(xiàn)U Lanfang
(Academy of Military Transportation,Tianjin,300161,China)
Abstract:ATM′s running is very important,vindicator must analyse and deal with each fault in time and generally.ATM′s running program is developed,based on popular Python language with wxPython GUI toolkit.This method has short development period and friendly interface and simple operation.
Keywords:python;journal log files;analysis tool;ATM
銀行自助設(shè)備為用戶的銀行交易提供更多的方便,可以24 h為用戶提供服務(wù)。目前隨著銀行卡發(fā)行量的增多,銀行自助取款設(shè)備的使用頻率在逐步提高。但因自助取款設(shè)備無人值守的特點(diǎn),設(shè)備的運(yùn)行狀況便成了一個(gè)非常重要的關(guān)注點(diǎn)。目前除了實(shí)時(shí)的監(jiān)控系統(tǒng)之外,流水記錄文件的分析便是機(jī)器運(yùn)行狀況的主要參考內(nèi)容。從機(jī)器流水記錄中可以分析機(jī)器的運(yùn)行狀況、各周期交易量、正常及異常的交易明細(xì)等。大多自助設(shè)備的交易量很大,每日可達(dá)幾百筆業(yè)務(wù),這樣,多臺(tái)機(jī)器經(jīng)過幾個(gè)周期運(yùn)行之后的數(shù)據(jù)量很大,這無疑給設(shè)備的故障分析工作帶來了很大的難度。因此,專為流水記錄文件寫一個(gè)分析軟件便顯得非常迫切?;谠摫尘?,介紹如何使用Python語言開發(fā)分析流水記錄文件工具的過程。
1 Python語言介紹
Python是免費(fèi)的解釋性語言[1],具有面向?qū)ο蟮奶匦裕梢赃\(yùn)行在多種操作系統(tǒng)之上,它繼承了傳統(tǒng)編譯語言的強(qiáng)大性和通用性,同時(shí)也借鑒了簡單腳本和解釋語言的易用性。Python具有清晰的結(jié)構(gòu)、簡潔的語法以及強(qiáng)大的功能,可以完成從文本處理到網(wǎng)絡(luò)通信等各種工作,并且其自身已經(jīng)提供了大量的模塊來實(shí)現(xiàn)各種功能,除此以外還可以使用C/C++來擴(kuò)展,甚至還可以將其嵌入到其他語言中。
Python語言特點(diǎn)[2]:
(1) 自由軟件:遵循GPL協(xié)議,不需要支持任何費(fèi)用,也不用擔(dān)心版權(quán)問題,可閱讀其源代碼。
(2) 跨平臺(tái):Python最初是在MAC操作系統(tǒng)下實(shí)現(xiàn)的,有很強(qiáng)的移植性,可運(yùn)行在多種流水行操作系統(tǒng)之上,如Linux,Windows,MAC等。
(3) 功能強(qiáng)大:可以使用在多個(gè)領(lǐng)域,如系統(tǒng)編程,幫助用戶完成繁瑣的日常工作;科學(xué)計(jì)算,它簡潔的語法可以像使用計(jì)算器一樣來完成科學(xué)計(jì)算;快速原型,它省去了編譯調(diào)試的過程,可以快速地實(shí)現(xiàn)系統(tǒng)原形;Web編程,使用它可以編寫CGI,而現(xiàn)在流行的Web框架也可以使用Python實(shí)現(xiàn)。
(4) 可擴(kuò)展:通過使用C/C++可以對Python進(jìn)行擴(kuò)展;Python也可以嵌入到C/C++編寫的程序之中。在某些情況下,它可以作為動(dòng)態(tài)鏈接庫的替代品在C/C++中使用。
(5) 易學(xué)易用:語法簡單;使用變量時(shí)無需事先聲明;使用Python不必關(guān)心內(nèi)在的使用,它會(huì)自動(dòng)地分配、回收內(nèi)存;Python提供了強(qiáng)大的內(nèi)置對象和方法,如本文使用的open()方法;使用Python可以減少其他編程語言的復(fù)雜性,例如在C語言中使用數(shù)十行代碼實(shí)現(xiàn)的排序,而在Python中,可以使用列表的排序函數(shù)輕易完成。
2 流水記錄文件特性
流水記錄文件是記錄機(jī)器運(yùn)行狀態(tài)的log文件,包含機(jī)器運(yùn)行時(shí)的各種硬件狀態(tài)、網(wǎng)絡(luò)狀態(tài)、用戶操作記錄、管理員操作記錄等內(nèi)容,是分析機(jī)器運(yùn)行狀況具的重要依據(jù)之一。
(1) 文件類型:以日期命名的純文本格式文件。
(2) 文件內(nèi)容:交易時(shí)機(jī)器狀態(tài)及相關(guān)交易信息;
操作員對機(jī)器的操作記錄;
待機(jī)時(shí)機(jī)器當(dāng)前狀態(tài);
網(wǎng)絡(luò)鏈接狀態(tài);
機(jī)器重啟時(shí)的相關(guān)信息等。
(3) 文件關(guān)鍵字:插卡日期、卡號(hào)、交易類別、交易金額、交易成功標(biāo)志、交易失敗標(biāo)志、失敗原因、網(wǎng)絡(luò)故障等。
(4) 文件位置:位于ATM機(jī)器硬盤內(nèi),部分文件同步于銀行后臺(tái)主機(jī)。
3 基于Python語言開發(fā)的分析流水記錄文件工具
3.1 開發(fā)原理
通過Python語言的內(nèi)置函數(shù)open()來打開流水文件[3],返回一個(gè)文件對象,然后用for循環(huán)遍歷這個(gè)流水文件對象,通過字符串匹配的方式來查找主要關(guān)鍵字并保存相關(guān)信息,然后計(jì)算生成所需要的各種字符串信息或列表供分析使用。
3.2 環(huán)境介紹
開發(fā)語言:Python 2.5.4
界面框架:wxPython 2.8-win32-unicode-2.8.10.1-py25;
運(yùn)行環(huán)境:所有 Unix 衍生系統(tǒng)(Linux,MacOS X,Solaris,F(xiàn)reeBSD等),Win32家族(Windows NT,2000,XP 等),
早期平臺(tái):MacOS 8/9,Windows 3.x,DOS,OS/2,AIX[4]。
3.3 程序?qū)崿F(xiàn)
該程序采用面向?qū)ο蟮木幊谭椒▉韺Ω鱾€(gè)模塊的功能進(jìn)行實(shí)現(xiàn),JrnAnalyse.pyw 來初始化程序,并調(diào)用mainframe模塊進(jìn)行程序界面顯示,在mainframe模塊中調(diào)用jrn模塊進(jìn)行流水文件分析,jrn模塊返回分析結(jié)果給mainframe模塊進(jìn)行顯示或是存盤。程序框圖如圖1所示。
3.3.1 Python實(shí)現(xiàn)處理文件
文件也可以看作是Python中的數(shù)據(jù)類型。當(dāng)使用Python的內(nèi)置函數(shù)open打開一個(gè)文件時(shí),返回一個(gè)文件對象。其原型如下所示 [5]:
open(filename,mode,bufsize)
其參數(shù)含義如下:
filename:要打開的文件名。
mode:可選參數(shù),文件打開模式。
bufsize:可選參數(shù),緩沖區(qū)大小。
其中mode可以是″r″表示讀方式打開文件;″w″表示以寫方式打開文件;″b″表示以二進(jìn)制方式打開文件。
圖1 程序框圖
open()成功執(zhí)行并返回一個(gè)文件對象之后,所有對該文件的后續(xù)操作都將通過這個(gè)“句柄”進(jìn)行。文件方法可以分為四類:輸入,輸出,文件內(nèi)移動(dòng),以及雜項(xiàng)操作。以下介紹要用到的幾個(gè)最基本的方法:
file.write():向文件中寫入字符串,使用此方法來保存成功交易明細(xì)或疑問帳信息[6]。
file.close():關(guān)閉打開的文件
對所打開的文件對象進(jìn)行遍歷來查找所需要的信息,是進(jìn)行流水記錄分析的重要過程,示例如下:
file=open(″filename″,″rU″)
#U參數(shù)可解決文件結(jié)束符不統(tǒng)一的問題,如\\\\r會(huì)替換為\\\,這樣在用for循環(huán)的時(shí)候就統(tǒng)一了行結(jié)束標(biāo)志。
for line in file: #使用for循環(huán)對文件對象file進(jìn)行遍歷,line為filename中的每一行數(shù)據(jù)。
print line#此例為打印line數(shù)據(jù)到屏幕
3.3.2 wxPython實(shí)現(xiàn)GUI界面顯示
wxPython是跨平臺(tái)工具庫wxWidgets的封裝。wxWidgets庫是由C++編寫的,它類似于Windows的MFC[7]。wxWidgets提供了對多種操作系統(tǒng)的支持。由于它良好的可移植性,wxPython也具備了跨平臺(tái)的能力。在Python中使用wxPython可以編寫具有跨平臺(tái)能力的GUI腳本。
這里介紹能夠顯示圖形界面的幾個(gè)主要步驟:
# -*- coding:utf-8 -*-
import wx
class MyApp(wx.App):
def OnInit(self):
frame=wx.Frame(parent=None,title=′Hello,wxPython!′)
frame.Show()
return True
app=MyApp()
app.MainLoop()
開頭指定使用utf-8字符編碼,可顯示中文字符串。首先導(dǎo)入wx模塊,即wxPython。然后繼承wx模塊中的App類創(chuàng)建了一個(gè)MyApp類[8]。在Myapp類中重載了OnInit方法。OnInit方法是窗口初始化的一部分,在該方法中創(chuàng)建了一個(gè)窗口框架,并顯示該窗口。一般來講,OnInit方法最后應(yīng)返回True。最后兩行,將MyApp類實(shí)例化成app對象,然后調(diào)用其MainLoop方法進(jìn)入消息循環(huán)。
3.3.3 程序結(jié)構(gòu)
(1) 程序啟動(dòng)文件:JrnAnalyse.pyw
# -*- coding:utf-8 -*-
″″″
atmtool.py:A tool for analyse atm jounarl files# 文件注釋
″″″
import wx #導(dǎo)入wxpython模塊
import mainframe#導(dǎo)入mainframe模塊
class AtmApp(wx.App):#定義啟動(dòng)類
def_init_(self,redirect=False,filename=None):# 重載生成對象時(shí)初始化方法
wx.App._init_(self,redirect,filename)
def OnInit(self):# 重載窗口初始化方法
self.main=mainframe.CreatMainframe(None)
self.main.Show()
self.SetTopWindow(self.main)
return True
if _name_ == ″_main_″:# 作為獨(dú)立程序啟動(dòng)
application=AtmApp()
application.MainLoop()
(2) 界面顯示模塊:mainframe.py
在該模塊中定義了各種顯示組件、界面組件操作方法;各方法列表如下:
def _init_(self,parent):# 定義并初始化各種顯示組件
def openDir(self):# 定義打開打開流水文件方法
def runJrn(self): # 定義調(diào)用流水分析模塊方法
def On_Quit(self,event):# 定義退出程序方法
def On_Help(self,event):# 定義幫助文件方法
def On_About(self,event):# 定義關(guān)于程序方法
def OnItemSelected(self,event):# 定義點(diǎn)擊列表方法
def getColumnText(self,index,col):# 定義點(diǎn)擊選擇列表內(nèi)容方法
def scroll2line(self,current_page):# 定義定位到疑問流水位置的方法
def OnOkTrans(self,event):# 定義保存成功交易方法
(3) 流水分析模塊:jrn.py
該模塊進(jìn)行每個(gè)流水記錄文件的分析工作。
def get_date_card(self,line,jrnfp) [9]:# 定義獲取用戶交易日期卡號(hào)方法
def get_cwd_amount(self,line):# 定義獲取用戶取款交易金額方法
def get_dep_amount(self,line,jrnfp)# 定義獲取用戶存款交易金額方法
def total(self,jrns):# 定義計(jì)算多周期交易匯總信息方法
def question(self,jrns):# 定義獲取疑問交易方法
def hardware(self,jrns):# 定義獲取機(jī)器硬件異常方法
if _name_ == ″_main_″:# 流水模塊自省語句判斷
下面將主要流水模塊中的分析情況舉例說明如下:
獲取用戶交易日期和卡號(hào)例子:
def get_date_card(self,line,jrnfp):
date=″″
card_no=″″
if ′=AcceptCard′ in line:# 獲取插卡日期
date=line
cwd_amount=″″# 如果插卡則將cwd_amount清空
elif ′CardType:′ in line# 獲取插卡卡號(hào)
card_no=line# 將卡號(hào)保存在card_no變量中
return date,card_no# 返回插卡日期和卡號(hào)
獲取用戶取款交易金額例子:
def get_cwd_amount(self,line,jrnfp):
if ′-CWD Amount:′ in line:# 如果關(guān)鍵字-CWD Amount在本行中
temp=line.split()[1]
amount=int(temp.split(′:′)[1])# 將取款金額字符串轉(zhuǎn)成整形后保存
return amount# 返回取款金額
獲取用戶取款成功標(biāo)志例子:
if ′WITHDRAWAL OK′ in line[10]:# 如果取款成功標(biāo)志在本行中
cwd_ok_amount += amount# 累加取款金額
cwd_ok_num += 1# 累加取款筆數(shù)
money_taken=True# 只要條件匹配一次,就將取鈔標(biāo)志置真
succeed_trans += (date.strip() + ″ ″ + card.strip() + ″ ″ + str(cwd_amount) + ″ cwd succeed\\\″) # 保存成功交易明細(xì)
獲取用戶存款交易金額例子:
def get_dep_amount(self,line,jrnfp):
dep_amount=0
if ′Amount:′ in line and ′TELLER:′ in line:#如果存款交易關(guān)鍵字在本行中
temp=line.split()[1]
dep_amount=int(temp.split(′:′)[1])#將存款金額字符串轉(zhuǎn)成整形后保存
return dep_amount# 返回存款金額
獲取用戶存款成功標(biāo)志例子:
if ″CASH IN NOTES OK″ in line:# 如果成功取款標(biāo)志在本行中
dep_ok_amount += dep_amount# 累加存款金額
dep_ok_num += 1# 累加存款筆數(shù)
cash_stored=True# 只要條件匹配一次,就將存鈔標(biāo)志置真
succeed_trans += (date.strip() + ″ ″ + card.strip() + ″ ″ + str(dep_amount) + ″ dep succeed\\\″)
# 保存成功交易明細(xì)
獲取管理員清機(jī)加鈔標(biāo)志:
if ′---RefillCash---′ in line:# 獲取加鈔標(biāo)志
Here do what you want
程序運(yùn)行示例:圖2是打開了多個(gè)流水記錄文件后程序的運(yùn)行顯示效果圖。
上左:疑問交易明細(xì) 上右:疑問交易概覽
下左:各周期交易匯總下右:硬件關(guān)鍵信息
圖2 運(yùn)行顯示效果圖
4 結(jié) 語
本文所述的基于Python語言的流水分析工具在分析自助設(shè)備運(yùn)行狀況中得到了很好的應(yīng)用,大大減少了
設(shè)備維護(hù)者的工作量。在一個(gè)交易周期還未結(jié)束時(shí),就可提前發(fā)現(xiàn)已經(jīng)出現(xiàn)的疑問帳務(wù),對于由于網(wǎng)絡(luò)問題而導(dǎo)致服務(wù)器記錄缺失現(xiàn)象有很大幫助,同時(shí)也提高了對客戶的服務(wù)水平。基于此方法,還可以用Python語言編寫分析工具來分析其他領(lǐng)域的記錄文件。
參考文獻(xiàn)
[1]Mark Lutz.Learning Python[M].3版.南京:東南大學(xué)出版社,2008.
[2][美]Wesley J Chun.Python核心編程[M].2版.宋吉廣,譯.北京:人民郵電出版社,2007.
[3]孫廣磊.征服Python——語言基礎(chǔ)與典型應(yīng)用[M].北京:人民郵電出版社,2007.
[4]NOEL RAPPIN.wxPython in Action[M].Manning Publications Co.,2006.
[5]Alex Martelli.Python in a Nutshell[M].2nd Edition.O′Reilly,2006.
[6]Magnus Lie Hetland.Beginning Python From Novice to Professional[M].Second Edition.2008.
[7]Tarek Ziadé.Expert Python Programming[M].Packt Publishing Ltd.2008.
[8]Jim Knowlton.Python?:Create-Modify-Reuse[M].Wiley Publishing Inc..2008.
[9]Mark Lutz.Programming Python[M].3rd Edition.O′Reilly,2006.
[10]David Mertz.Text Processing in Python[M].Addison Wesley,2003.