ファイルに行番号を書き込むツールを作ってみる

ソースコードをWordのファイルか何かにコピーする場合に、行番号を表示させて貼り付けたい場合がある。普段はTeraPadを使っているので調べてみると、TeraPadの場合にはAddNumというアドオンでその機能を実現できる。

http://www3.wind.ne.jp/enable/soft/
http://harpy.jp/delfy/tpadhelp/tips24.html

だが、Linuxからファイルを持ってきた場合に、(たぶん)改行文字によって正しく行が認識されないようで動作しない。TeraPad以外のエディタで一度、持ってきたファイルを保存して再度TeraPadで開けば問題はなくなるのだが、ちょっと面倒。
そこでPythonで、ファイルに行番号を追加して表示するツールを作成してみた。作成時間45分。手間をかけてないのでUIは雑だが、ちゃんと動くので目的は果たせる。

▲起動画面。配置が雑だ...。サイザーで並べるのはいつもながら面倒。

▲ファイルを選択(選択したファイルをどこかに表示させようよ)、行番号の桁数を指定して、保存するファイルの名前を決める。ボタンを押すと行番号付きのファイルが保存される。

▲行番号付きファイルの作成例。できた!

以下、ソースコード

# coding: utf-8
import wx

class MainFrame(wx.Frame):
    def __init__(self, id, title):
        width, height = 300, 200
        wx.Frame.__init__(self, id, title=u"ファイルに行番号を追加表示",
                          size=wx.Size(width, height))
        self.Pan = wx.Panel(self, -1)
        Hsizer1 = wx.BoxSizer(wx.HORIZONTAL)
        Hsizer2 = wx.BoxSizer(wx.HORIZONTAL)
        Hsizer3 = wx.BoxSizer(wx.HORIZONTAL)
        Vsizer = wx.BoxSizer(wx.VERTICAL)

        stTxt01 = wx.StaticText(self.Pan, -1, u"(1)ファイルの選択:")
        stTxt02 = wx.StaticText(self.Pan, -1, u"(2)行番号の桁数を指定:")
        stTxt03 = wx.StaticText(self.Pan, -1, u"(3)新しいファイル名を指定:")

        btn01 = wx.Button(self.Pan, -1, u"選択")
        self.Spn = wx.SpinCtrl(self.Pan, -1, '5', min=1, max=10)
        self.txt01 = wx.TextCtrl(self.Pan, -1, u"ファイル名を入力")
        btn02 = wx.Button(self.Pan, -1, u"行番号を追加")        
        btn01.Bind(wx.EVT_BUTTON, self.chooseFile)
        btn02.Bind(wx.EVT_BUTTON, self.addNum)
        
        Hsizer1.Add(stTxt01, 0, wx.ALL, 2)
        Hsizer1.Add(btn01,   0, wx.ALL, 2)
        Hsizer2.Add(stTxt02, 0, wx.ALL, 2)
        Hsizer2.Add(self.Spn,0, wx.ALL, 2)
        Hsizer3.Add(stTxt03, 0, wx.ALL, 2)
        Hsizer3.Add(self.txt01, 0, wx.ALL, 2)
        Vsizer.Add(Hsizer1, 0, wx.ALL, 2)
        Vsizer.Add(Hsizer2, 0, wx.ALL, 2)
        Vsizer.Add(Hsizer3, 0, wx.ALL, 2)
        Vsizer.Add(btn02, 0, wx.ALL, 2)

        self.Pan.SetSizer(Vsizer)
        Vsizer.Fit(self.Pan)

    def chooseFile(self, event):
        dlg = wx.FileDialog(self, message=u'ファイルを選択')
        ansBtn = dlg.ShowModal()
        self.fileName = dlg.GetFilename()
        self.filePath  = dlg.GetPath()

    def addNum(self, event):
        tot = self.Spn.GetValue()
        self.txt01.GetValue()
        finp = open(self.filePath, 'r')
        fout = open(self.txt01.GetValue(), 'w')
        rownum = 0
        for i in finp.readlines():
            rownum += 1
            num = str(rownum)
            fout.write('0'*(tot-len(num)) + num + ' ' + i)
        finp.close()
        fout.close()
        return True

class Application(wx.App):
    def OnInit(self):
        frame = MainFrame(None, -1)
        frame.Show(True)
        self.SetTopWindow(frame)
        return True

def main():
    app = Application(0)
    app.MainLoop()

if __name__ == '__main__':
    main()