芋の独り言

当ブログへのアクセスは当ブログのプライバシーポリシーに同意したものとみなします.

Pythonを使ったCSVからLaTeXの表への変換

MyDialogは参考サイトをコピペしました. ありがたく使わせてもらってます~


import pandas as pd
import wx
app = wx.App()

check_items = [
    "列名の出力",
    "行名の出力",
    "インデックス名の出力",
    "行名の太字化"
    ]

class MyDialog(wx.Dialog):
    def __init__(self):
        wx.Dialog.__init__(self, None, -1, 'Title', size=(200,160))
        # Add components.
        self.check = wx.CheckListBox(self, wx.ID_ANY,
                                     choices=check_items,
                                     name='チェック')
        btnOk = wx.Button(self, wx.ID_OK)
        btnOk.SetDefault()
        #btnCancel = wx.Button(self, wx.ID_CANCEL)

        # Set button sizer.
        btns = wx.StdDialogButtonSizer()
        btns.AddButton(btnOk)
        btns.Realize()

        # Set main sizer.
        sizer = wx.BoxSizer(wx.VERTICAL)
        sizer.Add(self.check, 1, wx.EXPAND|wx.ALL, 3)
        sizer.Add(btns, 0, wx.EXPAND|wx.ALL, 5)
        self.SetSizer(sizer)

# 項目のチェック
def ask_check():
    with MyDialog() as dlg:
        if dlg.ShowModal() == wx.ID_OK: 
            return [dlg.check.IsChecked(item) for item,name in enumerate(check_items)]
            
# ファイルの選択
def choice_file():
    # ファイル選択ダイアログを作成
    with wx.FileDialog(None, u'ファイル選択してください', wildcard="csv files (*.csv)|*.csv",
                       style=wx.FD_OPEN | wx.STAY_ON_TOP | wx.FD_MULTIPLE) as dialog:
        res = dialog.ShowModal()
        if res == wx.ID_CANCEL:
            import sys
            sys.exit()   
        elif res == wx.ID_OK:
        # ファイルが選択されたとき
            csvlist=dialog.GetPaths()
            if type(csvlist) == list:
                return csvlist
            else:
                return [csvlist]

# 保存先フォルダを選択
def choice_folda():
    wx.MessageBox('保存先フォルダを選択してください','フォルダ選択',wx.STAY_ON_TOP)
    # フォルダ選択ダイアログを作成
    with wx.DirDialog(None,style=wx.DD_CHANGE_DIR | wx.OK | wx.STAY_ON_TOP,
                      message="保存先フォルダ") as folda:
        # フォルダが選択されたとき
        if folda.ShowModal() == wx.ID_OK:
            return folda.GetPath()

def convert(path):
    import os
    header,index,bold_rows,index_names = ask_check()
    table = pd.read_csv(path)
    if table.shape[0] > 44:
        longtable=True
    else:
        longtable=None
    #print(header,index,bold_rows,index_names,longtable)
    table.to_latex(
        buf=os.path.join(choice_folda(),path.split(os.path.sep)[-1].split(".")[0]+".tex"),
        header=header,
        index=index,
        index_names=index_names,
        bold_rows=bold_rows,
        caption="",
        longtable=longtable
        )

def csv2latex(files:list):
    for path in files:
        convert(path)

if __name__ == "__main__":
    files = choice_file()
    csv2latex(files)

Pandascsvを読み込んで,Pandasのメソッドで[tex:\LaTeX]の表として出力する一連のスクリプトです. 作成された[tex:\LaTeX]の表を使うには

\usepackage{booktabs}
\usepackage{longtable}

というようにパッケージを読み込んでおいてください.

Pandaswxの前にimportしてください. wxを先にimportすると環境がja-JPになるようで, これだとPandasがエラーになります.

index_namesがよく分かりません...あってもなくてもどっちでも良いかなと思います.

以上はcsvファイルでなくとも,pandasで取り扱えるデータ形式ならば使えます. pandasはtsvファイルを読み込むメソッドもあるはずなのでtsvはできるでしょう. また,リストや辞書型もpd.DataFrame()にツッコめばcsvと同様に変換できますね~

参考サイト