名称:数据格式化工具
描述:本工具用于将指定格式的数据转换为另一种指定格式的数据
版本:v1.1(2014a)
*被格式化数据
1.通过分隔符分隔,未换行
2.通过分隔符分隔,换行
3.通过换行符分隔
*目标数据
1.通过分隔符分隔,未换行
2.通过分隔符分隔,换行
3.通过换行符分隔
*格式化操作
1.数据类别:
无&''&""&‘’&“”&<>&[]
[自定义]
2.分隔符:
&,&;&,&;&/&\&|&、&-
[自定义]
3.转化方式:
1 -> 1
1 -> 2
1 ->3
2 ->1
2 ->2
2 ->3
3->1
3 ->2
3 ->3
*设计蓝图
1.被格式化数据
文本框,支持换行
2.目标数据
文本框,支持换行
3.操作栏
分别指定被格式化数据和目标数据的格式
(1)数据类别
(2)分隔符
(3)是否换行
4.执行按钮
5.配置文件
优先读取配置文件数据,无配置文件时,使用默认设置,可修改配置文件
DataFormat.py
# -*- coding:utf-8 -*-
'''
名称:数据格式化工具
描述:本工具用于将指定格式的数据转换为另一种指定格式的数据
版本:v1.1(2014a)
'''
from UI import mainframe
from Src import configfile
if __name__ == '__main__':
version = 'v1.1(2014a)'
try:
formatchoices = configfile.getformatchoices()[0]
except:
formatchoices = [[u'无', u"''", u'""', u'‘’', u'“”', u'<>', u'[]'], [u'', u',', u';', u',', u';', u'/', u'\\', u'|', u'、', u'-']]
mainframe.mainframe(version, formatchoices)
UI/mainframe.py
# -*- coding:utf-8 -*-
'''主界面'''
import wx
from UI import makeconfig
from Src import format, configfile
class DataFormatFrame(wx.Frame):
def __init__(self, version, formatchoices):
self.version = version
self.formatchoices = formatchoices
wx.Frame.__init__(self, None, -1, 'DataFormat' + ' ' + version)
self.panel = wx.Panel(self)
self.panel.SetBackgroundColour('white')
self.DFMenuBar()
self.DFStatusBar()
self.InitUI()
#定时更新状态栏
self.timer = wx.Timer(self)
self.timer.Start(1000)
self.AllEvent()
self.SetSize((600,500))
self.Centre()
self.Show()
def DFMenuBar(self):
'''菜单栏'''
self.ID_MENU_CFGFILE = wx.NewId()
self.ID_MENU_HELP = wx.NewId()
menubar = wx.MenuBar()
menu_file = wx.Menu()
menu_file.Append(self.ID_MENU_CFGFILE, u'配置文件')
menu_help = wx.Menu()
menu_help.Append(self.ID_MENU_HELP, u'说明')
menubar.Append(menu_file, 'File')
menubar.Append(menu_help, 'Help')
self.SetMenuBar(menubar)
def DFStatusBar(self):
'''状态栏'''
self.statusbar = wx.StatusBar(self)
self.statusbar.SetLabel(u'请先录入需要格式化的数据!')
self.SetStatusBar(self.statusbar)
def InitUI(self):
'''操作区域'''
self.ID_OPERATION_FORMAT = wx.NewId()
#被格式化数据
srcinfo = wx.StaticText(self.panel, -1, u'被格式化数据>>')
self.srcdatabox = wx.TextCtrl(self.panel, -1, '', style=wx.TE_MULTILINE)
#指定被格式化数据格式
srcformat_category = wx.StaticText(self.panel, -1, u'数据类别:')
self.srcformat_categorydata = wx.ComboBox(self.panel, -1, choices=self.formatchoices[0])
self.srcformat_categorydata.Select(0)
srcformat_split = wx.StaticText(self.panel, -1, u'分隔符:')
self.srcformat_splitdata = wx.ComboBox(self.panel, -1, choices=self.formatchoices[1])
self.srcformat_splitdata.Select(0)
self.srcformat_newline = wx.CheckBox(self.panel, -1, u'换行')
self.srcformat_newline.SetValue(True)
#目标数据
ppsinfo = wx.StaticText(self.panel, -1, u'目标数据>>')
self.ppsdatabox = wx.TextCtrl(self.panel, -1, '', style=wx.TE_MULTILINE)
#指定目标数据格式
ppsformat_category = wx.StaticText(self.panel, -1, u'数据类别:')
self.ppsformat_categorydata = wx.ComboBox(self.panel, -1, choices=self.formatchoices[0])
self.ppsformat_categorydata.Select(0)
ppsformat_split = wx.StaticText(self.panel, -1, u'分隔符:')
self.ppsformat_splitdata = wx.ComboBox(self.panel, -1, choices=self.formatchoices[1])
self.ppsformat_splitdata.Select(0)
self.ppsformat_newline = wx.CheckBox(self.panel, -1, u'换行')
#格式化按钮
formatbutton = wx.Button(self.panel, self.ID_OPERATION_FORMAT, u'格式化')
#布局
mainsizer = wx.BoxSizer(wx.VERTICAL)
infosizer = wx.BoxSizer(wx.HORIZONTAL)
infosizer.Add(srcinfo, 1, wx.ALL, 3)
infosizer.Add(ppsinfo, 1, wx.ALL, 3)
databoxsizer = wx.BoxSizer(wx.HORIZONTAL)
databoxsizer.Add(self.srcdatabox, 1, wx.ALL|wx.EXPAND, 3)
databoxsizer.Add(self.ppsdatabox, 1, wx.ALL|wx.EXPAND, 3)
srcformatsizer = wx.BoxSizer(wx.HORIZONTAL)
srcformatsizer.Add(srcformat_category, 0, wx.ALL, 3)
srcformatsizer.Add(self.srcformat_categorydata, 1, wx.ALL)
srcformatsizer.Add(srcformat_split, 0, wx.ALL, 3)
srcformatsizer.Add(self.srcformat_splitdata, 1, wx.ALL)
srcformatsizer.Add(self.srcformat_newline, 0, wx.ALL, 5)
ppsformatsizer = wx.BoxSizer(wx.HORIZONTAL)
ppsformatsizer.Add(ppsformat_category, 0, wx.ALL, 3)
ppsformatsizer.Add(self.ppsformat_categorydata, 1, wx.ALL)
ppsformatsizer.Add(ppsformat_split, 0, wx.ALL, 3)
ppsformatsizer.Add(self.ppsformat_splitdata, 1, wx.ALL)
ppsformatsizer.Add(self.ppsformat_newline, 0, wx.ALL, 3)
formatsizer = wx.BoxSizer(wx.HORIZONTAL)
formatsizer.Add(srcformatsizer, 1, wx.ALL, 5)
formatsizer.Add(ppsformatsizer, 1, wx.ALL, 5)
formatbuttonsizer = wx.BoxSizer(wx.HORIZONTAL)
#加空格使右对齐
formatbuttonsizer.Add((0,0), 1)
formatbuttonsizer.Add(formatbutton, 0, wx.ALL, 10)
mainsizer.Add(infosizer, 0, wx.EXPAND)
mainsizer.Add(databoxsizer, 1, wx.EXPAND)
mainsizer.Add(formatsizer, 0, wx.EXPAND)
mainsizer.Add(formatbuttonsizer, 0, wx.EXPAND)
self.panel.SetSizer(mainsizer)
def AllEvent(self):
self.Bind(wx.EVT_MENU, self.configfile, id=self.ID_MENU_CFGFILE)
self.Bind(wx.EVT_MENU, self.helpfile, id=self.ID_MENU_HELP)
self.Bind(wx.EVT_BUTTON, self.formatbutton, id=self.ID_OPERATION_FORMAT)
self.Bind(wx.EVT_TIMER, self.OnTimer, self.timer)
def configfile(self, event):
'''编辑配置文件'''
if configfile.IsExists() is False:
configfile.writeformatchoices(u'无&\'\'&""&‘’&“”&<>&[]', u'&,&;&,&;&/&\&|&、&-')
makeconfig.makeconfig()
def helpfile(self, event):
'''说明文件'''
wx.MessageBox(u'''名称:数据格式化工具
描述:本工具用于将指定格式的数据转换为另一种指定格式的数据
版本:%s'''%self.version, u'说明')
def formatbutton(self, event):
'''格式化执行事件'''
srcdata = self.srcdatabox.GetValue()
if srcdata == '':
wx.MessageBox(u'请先录入需要格式化的数据!', u'数据错误')
return
formatdata = []
formatdata.append(self.srcformat_categorydata.GetValue())
formatdata.append(self.srcformat_splitdata.GetValue())
formatdata.append(self.srcformat_newline.GetValue())
formatdata.append(self.ppsformat_categorydata.GetValue())
formatdata.append(self.ppsformat_splitdata.GetValue())
formatdata.append(self.ppsformat_newline.GetValue())
ppsdata = format.format(srcdata, formatdata)
self.ppsdatabox.SetValue(ppsdata)
def OnTimer(self, event):
srcdata = self.srcdatabox.GetValue()
if srcdata == '':
self.statusbar.SetLabel(u'请先录入需要格式化的数据!')
else:
self.statusbar.SetLabel(u'指定数据格式后,点击“格式化”按钮!')
def mainframe(version, formatchoices):
app = wx.App()
DataFormatFrame(version, formatchoices)
app.MainLoop()
UI/makeconfig.py
# -*- coding:utf-8 -*-
'''编辑配置文件'''
import wx
from Src import configfile
class ConfigFrame(wx.Frame):
def __init__(self):
wx.Frame.__init__(self, None, -1, u'编辑配置文件', style=wx.CAPTION|wx.SYSTEM_MENU|wx.CLOSE_BOX)
self.panel = wx.Panel(self)
self.panel.SetBackgroundColour('white')
self.InitUI()
self.AllEvent()
self.loadconfig()
self.SetSize((300,400))
self.Centre()
self.Show()
def InitUI(self):
'''操作区域'''
self.ID_OPERATION_UPDATE = wx.NewId()
#数据类别
categoryinfo = wx.StaticText(self.panel, -1, u'数据类别:')
self.categorydatabox = wx.TextCtrl(self.panel, -1, '', style=wx.TE_MULTILINE)
#分割符
splitinfo = wx.StaticText(self.panel, -1, u'分割符:')
self.splitdatabox = wx.TextCtrl(self.panel, -1, '', style=wx.TE_MULTILINE)
#更新按钮
updatebutton = wx.Button(self.panel, self.ID_OPERATION_UPDATE, u'更新')
#提示信息
info = wx.StaticText(self.panel, -1, u'提示:修改数据类型和分隔符时请用“&&”符号分割!')
info.SetForegroundColour('red')
#布局
mainsizer = wx.BoxSizer(wx.VERTICAL)
mainsizer.Add(categoryinfo, 0, wx.ALL, 5)
mainsizer.Add(self.categorydatabox, 1, wx.ALL|wx.EXPAND, 5)
mainsizer.Add(splitinfo, 0, wx.ALL, 5)
mainsizer.Add(self.splitdatabox, 1, wx.ALL|wx.EXPAND, 5)
mainsizer.Add(updatebutton, 0, wx.ALL|wx.CENTER, 5)
mainsizer.Add(info, 0, wx.ALL, 5)
self.panel.SetSizer(mainsizer)
def loadconfig(self):
try:
categorychoices = configfile.getformatchoices()[1]
splitchoices = configfile.getformatchoices()[2]
except:
categorychoices = '数据不存在,请手动录入!'
splitchoices = '数据不存在,请手动录入!'
self.categorydatabox.SetValue(categorychoices)
self.splitdatabox.SetValue(splitchoices)
def AllEvent(self):
self.Bind(wx.EVT_BUTTON, self.updatebutton, id=self.ID_OPERATION_UPDATE)
def updatebutton(self, event):
categorychoices = self.categorydatabox.GetValue()
splitchoices = self.splitdatabox.GetValue()
if categorychoices == '' or splitchoices == '':
wx.MessageBox(u'请填写数据后再更新!', u'提示')
return
try:
configfile.writeformatchoices(categorychoices, splitchoices)
wx.MessageBox(u'更新成功,重起程序后生效!', u'提示')
except:
wx.MessageBox(u'更新失败,请检查数据!')
self.loadconfig()
def makeconfig():
app = wx.App()
ConfigFrame()
app.MainLoop()
Src/format.py
# -*- coding:utf-8 -*-
'''格式化算法'''
def format(srcdata, formatdata):
#被格式化数据:无数据类别
if formatdata[0] == u'无':
#换行+无分隔符
if formatdata[2] is True and formatdata[1] == '':
ppsdatalist = srcdata.replace(' ', '').split('\n')
#换行+有分隔符
elif formatdata[2] is True:
ppsdatalist = srcdata.replace(' ', '').split(formatdata[1] + '\n')
#不换行+无分隔符
elif formatdata[1] == '':
ppsdatalist = srcdata.split(' ')
while '' in ppsdatalist:
ppsdatalist.remove('')
#不换行+有分隔符
else:
ppsdatalist = srcdata.replace(' ', '').split(formatdata[1])
#被格式化数据:带数据类别
else:
category_left = formatdata[0][0]
category_right = formatdata[0][1]
#换行+无分隔符
if formatdata[2] is True and formatdata[1] == '':
ppsdatalist = srcdata.replace(' ', '').split(category_right + '\n' + category_left)
#换行+有分隔符
elif formatdata[2] is True:
ppsdatalist = srcdata.replace(' ', '').split(category_right + formatdata[1] + '\n' + category_left)
#不换行+无分隔符
elif formatdata[1] == '':
ppsdatalist = srcdata.split(category_right + ' ' + category_left)
while '' in ppsdatalist:
ppsdatalist.remove('')
#不换行+有分隔符
else:
ppsdatalist = srcdata.replace(' ', '').split(category_right + formatdata[1] + category_left)
#去掉头尾的数据类别符号
ppsdatalist[0] = ppsdatalist[0].replace(category_left, '')
ppsdatalist[-1] = ppsdatalist[-1].replace(category_right, '')
#目标数据:无数据类别
if formatdata[3] == u'无':
#换行+无分隔符
if formatdata[5] is True and formatdata[4] == '':
ppsdata = '\n'.join(ppsdatalist)
#换行+有分隔符
elif formatdata[5] is True:
ppsdata = (formatdata[4] + '\n').join(ppsdatalist)
#不换行+无分隔符
elif formatdata[4] == '':
ppsdata = ' '.join(ppsdatalist)
#不换行+有分隔符
else:
ppsdata = formatdata[4].join(ppsdatalist)
#目标数据:带数据类别
else:
category_left = formatdata[3][0]
category_right = formatdata[3][1]
#换行+无分隔符
if formatdata[5] is True and formatdata[4] == '':
ppsdata = (category_right + '\n' + category_left).join(ppsdatalist)
#换行+有分隔符
elif formatdata[5] is True:
ppsdata = (category_right + formatdata[4] + '\n' + category_left).join(ppsdatalist)
#不换行+无分隔符
elif formatdata[4] == '':
ppsdata = (category_right + ' ' + category_left).join(ppsdatalist)
#不换行+有分隔符
else:
ppsdata = (category_right + formatdata[4] + category_left).join(ppsdatalist)
#增加头尾的数据类别符号
ppsdata = category_left + ppsdata + category_right
return ppsdata
Src/configfile.py
# -*- coding:utf-8 -*-
'''处理配置文件'''
import ConfigParser
import os
filename = 'Dfconfig.ini'
def IsExists():
if not os.path.exists(filename):
return False
else:
return True
def getformatchoices():
'''读取配置文件,返回所有格式化数据、数据类别和间隔符选项'''
cf = ConfigParser.SafeConfigParser()
cf.read(filename)
try:
categorychoices = cf.get('FormatChoices', 'categorychoices').decode('utf-8')
splitchoices = cf.get('FormatChoices', 'splitchoices').decode('utf-8')
except:
categorychoices = cf.get('FormatChoices', 'categorychoices').decode('gbk')
splitchoices = cf.get('FormatChoices', 'splitchoices').decode('gbk')
formatchoices = []
formatchoices.append(categorychoices.split('&'))
formatchoices.append(splitchoices.split('&'))
return formatchoices, categorychoices, splitchoices
def writeformatchoices(categorychoices, splitchoices):
cf = ConfigParser.SafeConfigParser()
cf.add_section('FormatChoices')
cf.set('FormatChoices', 'categorychoices', categorychoices.encode('utf-8'))
cf.set('FormatChoices', 'splitchoices', splitchoices.encode('utf-8'))
cf.write(open(filename, 'w'))
setup.py
# -*- coding:utf-8 -*-
from distutils.core import setup
import py2exe
options = {'py2exe': { 'compressed': 1, 'bundle_files': 1 }}
setup(options = options,
zipfile=None,
windows = [{'script':'DataFormat.py'}])
遗留问题:
1.设置图标后用py2exe打包无法运行
2.开启子窗口后再关闭主窗口,进程未被结束
3.TextCtrl怎么设置焦点至最后一个字符后
4.暂不支持多个空格作分隔符和多个换行符的情况