数据格式化工具源码~


名称:数据格式化工具
描述:本工具用于将指定格式的数据转换为另一种指定格式的数据
版本: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.暂不支持多个空格作分隔符和多个换行符的情况


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值