摘 要:無人值守銀行自助設備的運行狀況是一項非常重要的內容,維護者必須能夠及時分析并處理設備所出現的各種故障。自助設備交易流水文件詳細記錄了設備的運行狀況,為了分析該文件,基于當前流行的Python語言,并配合wxPython GUI包為軟件開發平臺,開發了自助取款設備運行狀況分析程序,該軟件具有開發周期短、界面友好、操作簡單的優點。
關鍵詞:python;流水記錄文件;分析工具;ATM
中圖分類號:TP311文獻標識碼:A
文章編號:1004-373X(2010)05-131-04
Journal Log Files of ATM Based on Python
HE Huiying,FU Shaobo,AN Ju,FU 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
銀行自助設備為用戶的銀行交易提供更多的方便,可以24 h為用戶提供服務。目前隨著銀行卡發行量的增多,銀行自助取款設備的使用頻率在逐步提高。但因自助取款設備無人值守的特點,設備的運行狀況便成了一個非常重要的關注點。目前除了實時的監控系統之外,流水記錄文件的分析便是機器運行狀況的主要參考內容。從機器流水記錄中可以分析機器的運行狀況、各周期交易量、正常及異常的交易明細等。大多自助設備的交易量很大,每日可達幾百筆業務,這樣,多臺機器經過幾個周期運行之后的數據量很大,這無疑給設備的故障分析工作帶來了很大的難度。因此,專為流水記錄文件寫一個分析軟件便顯得非常迫切。基于該背景,介紹如何使用Python語言開發分析流水記錄文件工具的過程。
1 Python語言介紹
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 環境介紹
開發語言:Python 2.5.4
界面框架:wxPython 2.8-win32-unicode-2.8.10.1-py25;
運行環境:所有 Unix 衍生系統(Linux,MacOS X,Solaris,FreeBSD等),Win32家族(Windows NT,2000,XP 等),
早期平臺:MacOS 8/9,Windows 3.x,DOS,OS/2,AIX[4]。
3.3 程序實現
該程序采用面向對象的編程方法來對各個模塊的功能進行實現,JrnAnalyse.pyw 來初始化程序,并調用mainframe模塊進行程序界面顯示,在mainframe模塊中調用jrn模塊進行流水文件分析,jrn模塊返回分析結果給mainframe模塊進行顯示或是存盤。程序框圖如圖1所示。
3.3.1 Python實現處理文件
文件也可以看作是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會替換為\\\,這樣在用for循環的時候就統一了行結束標志。
for line in file: #使用for循環對文件對象file進行遍歷,line為filename中的每一行數據。
print line#此例為打印line數據到屏幕
3.3.2 wxPython實現GUI界面顯示
wxPython是跨平臺工具庫wxWidgets的封裝。wxWidgets庫是由C++編寫的,它類似于Windows的MFC[7]。wxWidgets提供了對多種操作系統的支持。由于它良好的可移植性,wxPython也具備了跨平臺的能力。在Python中使用wxPython可以編寫具有跨平臺能力的GUI腳本。
這里介紹能夠顯示圖形界面的幾個主要步驟:
# -*- 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字符編碼,可顯示中文字符串。首先導入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:A tool for analyse atm jounarl files# 文件注釋
″″″
import wx #導入wxpython模塊
import mainframe#導入mainframe模塊
class AtmApp(wx.App):#定義啟動類
def_init_(self,redirect=False,filename=None):# 重載生成對象時初始化方法
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_″:# 作為獨立程序啟動
application=AtmApp()
application.MainLoop()
(2) 界面顯示模塊:mainframe.py
在該模塊中定義了各種顯示組件、界面組件操作方法;各方法列表如下:
def _init_(self,parent):# 定義并初始化各種顯示組件
def openDir(self):# 定義打開打開流水文件方法
def runJrn(self): # 定義調用流水分析模塊方法
def On_Quit(self,event):# 定義退出程序方法
def On_Help(self,event):# 定義幫助文件方法
def On_About(self,event):# 定義關于程序方法
def OnItemSelected(self,event):# 定義點擊列表方法
def getColumnText(self,index,col):# 定義點擊選擇列表內容方法
def scroll2line(self,current_page):# 定義定位到疑問流水位置的方法
def OnOkTrans(self,event):# 定義保存成功交易方法
(3) 流水分析模塊:jrn.py
該模塊進行每個流水記錄文件的分析工作。
def get_date_card(self,line,jrnfp) [9]:# 定義獲取用戶交易日期卡號方法
def get_cwd_amount(self,line):# 定義獲取用戶取款交易金額方法
def get_dep_amount(self,line,jrnfp)# 定義獲取用戶存款交易金額方法
def total(self,jrns):# 定義計算多周期交易匯總信息方法
def question(self,jrns):# 定義獲取疑問交易方法
def hardware(self,jrns):# 定義獲取機器硬件異常方法
if _name_ == ″_main_″:# 流水模塊自省語句判斷
下面將主要流水模塊中的分析情況舉例說明如下:
獲取用戶交易日期和卡號例子:
def get_date_card(self,line,jrnfp):
date=″″
card_no=″″
if ′=AcceptCard′ in line:# 獲取插卡日期
date=line
cwd_amount=″″# 如果插卡則將cwd_amount清空
elif ′CardType:′ in line# 獲取插卡卡號
card_no=line# 將卡號保存在card_no變量中
return date,card_no# 返回插卡日期和卡號
獲取用戶取款交易金額例子:
def get_cwd_amount(self,line,jrnfp):
if ′-CWD Amount:′ in line:# 如果關鍵字-CWD Amount在本行中
temp=line.split()[1]
amount=int(temp.split(′:′)[1])# 將取款金額字符串轉成整形后保存
return amount# 返回取款金額
獲取用戶取款成功標志例子:
if ′WITHDRAWAL OK′ in line[10]:# 如果取款成功標志在本行中
cwd_ok_amount += amount# 累加取款金額
cwd_ok_num += 1# 累加取款筆數
money_taken=True# 只要條件匹配一次,就將取鈔標志置真
succeed_trans += (date.strip() + ″ ″ + card.strip() + ″ ″ + str(cwd_amount) + ″ cwd succeed\\\″) # 保存成功交易明細
獲取用戶存款交易金額例子:
def get_dep_amount(self,line,jrnfp):
dep_amount=0
if ′Amount:′ in line and ′TELLER:′ in line:#如果存款交易關鍵字在本行中
temp=line.split()[1]
dep_amount=int(temp.split(′:′)[1])#將存款金額字符串轉成整形后保存
return dep_amount# 返回存款金額
獲取用戶存款成功標志例子:
if ″CASH IN NOTES OK″ in line:# 如果成功取款標志在本行中
dep_ok_amount += dep_amount# 累加存款金額
dep_ok_num += 1# 累加存款筆數
cash_stored=True# 只要條件匹配一次,就將存鈔標志置真
succeed_trans += (date.strip() + ″ ″ + card.strip() + ″ ″ + str(dep_amount) + ″ dep succeed\\\″)
# 保存成功交易明細
獲取管理員清機加鈔標志:
if ′---RefillCash---′ in line:# 獲取加鈔標志
Here do what you want
程序運行示例:圖2是打開了多個流水記錄文件后程序的運行顯示效果圖。
上左:疑問交易明細 上右:疑問交易概覽
下左:各周期交易匯總下右:硬件關鍵信息
圖2 運行顯示效果圖
4 結 語
本文所述的基于Python語言的流水分析工具在分析自助設備運行狀況中得到了很好的應用,大大減少了
設備維護者的工作量。在一個交易周期還未結束時,就可提前發現已經出現的疑問帳務,對于由于網絡問題而導致服務器記錄缺失現象有很大幫助,同時也提高了對客戶的服務水平。基于此方法,還可以用Python語言編寫分析工具來分析其他領域的記錄文件。
參考文獻
[1]Mark Lutz.Learning Python[M].3版.南京:東南大學出版社,2008.
[2][美]Wesley J Chun.Python核心編程[M].2版.宋吉廣,譯.北京:人民郵電出版社,2007.
[3]孫廣磊.征服Python——語言基礎與典型應用[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.