ファイルに行番号を書き込むツールを作ってみる
ソースコードを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()