よちよちpython

独習 python/Qpython/Pydroid3/termux/Linux

csv→Markdownのテーブルに変換テスト

csvファイルを読み取り、マークダウンのテーブルに変換するテスト。



はじめに

とりあえず、保存してあるcsvファイルを読み取る。

import pandas as pd
import numpy as np # ←numpyは後で使う

# csvファイル名
file_name = "コマンド一覧表.csv"

# pandasでcsvを読む
df = pd.read_csv(file_name,header=None)
print(df)
                  0              1
0              コマンド             動作
1  curl ifconfig.me  グローバルIPアドレス取得
2         cat ファイル名        ファイルを開く
3    mv ファイル名 フォルダ名   ファイルをフォルダに移動



上記のようなcsvファイルの中身を、Pythonを使って次のようなテーブルに変換したい。  


  ↓ このような完成形を想像    

|コマンド|動作|  
|:--|:--|  
|curl ifconfig.me|グローバルIPアドレス取得|  
|cat ファイル名|ファイルを開く|  
|mv ファイル名 フォルダ名|ファイルをフォルダに移動| 

 

変換したものをマークダウンのビューアーで見ると表に見える。


  f:id:chayarokurokuro:20190910014116j:plain

そのままマークダウン記法でブログの編集画面に貼り付けるなどして投稿してもテーブルになる。

ここまでの作業をPythonでやるのが目標。



実験開始


まずは、2行目にテーブルを左寄せにするアラインメント行

|:--|:--|

  を入れようかと思った。  



Pandasを使えば任意の行に簡単に挿入できるだろう、と検索した。

意外にも、最下行に追加はあっても任意の行に挿入するメソッドのようなものが見つからない。    

「新しくDataFrameを作って、追加する形でつなげればできる」などとstackoverflowのQ&Aでやり取りされていたり、何かと不便なようだ。    

しかしnumpyを使えば簡単にできるっぽい。


うほっ!  


ここの5番目    
numpy.insert()を使えばできるぜ?」と紹介されている。  

 

後でcsvの区切り文字, カンマ| パイプに変換することを考えてアラインメント行の文字を入れたほうがよさそう。  

ではでは試してみましょ。  


上記のリンク、stackoverflowの回答を一部変え、実行。


df_2 = pd.DataFrame(np.insert(df.values, 1, values=[":--",":--" ], axis=0))

print(df_2)
                  0              1
0              コマンド             動作
1               :--            :--
2  curl ifconfig.me  グローバルIPアドレス取得
3         cat ファイル名        ファイルを開く
4    mv ファイル名 フォルダ名   ファイルをフォルダに移動

2行目にアラインメント行を挿入できました。  

 




そしたら次。   区切り文字のカンマ|(パイプ、パイプライン)に変換しようと考えた。     無駄な手順かもしれないが、新規csvファイルに書き込む。

# 新規ファイルに保存
file_name = "新コマンド一覧表.csv"
df_2.to_csv(file_name,sep="|",index=False,header=False)

↓ このようなcsvになる。  


f:id:chayarokurokuro:20190910014408j:plain




次に、各行の両端に|が付いていないので加工する。    

カンマを置き換えたcsvファイルをopen()関数のreadlines()で一行ずつ読み取り、両端に|パイプを取り付け、念のために新規作成したテキストファイルに保存した。

file_name = "新コマンド一覧表.csv"

with open(file_name,"r") as f:
    # 1行ずつ読み取りリストにする
    r = f.readlines()
    print(r)
    
    # 文字の加工
    lst = []
    for i in r:
        row = i.replace("\n","|\n")
        row = "|" + row
        print(row)
        
        lst.append(row)
    
# 加工後のリスト
print(lst)

# 一応、新規テキストファイルに保存
file_name = "新新コマンド一覧表.txt"

with open(file_name,"w") as f:
    f.writelines(lst)
    
    
['コマンド|動作\n', ':--|:--\n', 'curl ifconfig.me|グローバルIPアドレス取得\n', 'cat ファイル名|ファイルを開く\n', 'mv ファイル名 フォルダ名|ファイルをフォルダに移動\n']
|コマンド|動作|

|:--|:--|

|curl ifconfig.me|グローバルIPアドレス取得|

|cat ファイル名|ファイルを開く|

|mv ファイル名 フォルダ名|ファイルをフォルダに移動|

['|コマンド|動作|\n', '|:--|:--|\n', '|curl ifconfig.me|グローバルIPアドレス取得|\n', '|cat ファイル名|ファイルを開く|\n', '|mv ファイル名 フォルダ名|ファイルをフォルダに移動|\n']



両端にパイプが着いた。

出力させておこ。

with open(file_name,"r") as f:
    print(f.read())
|コマンド|動作|
|:--|:--|
|curl ifconfig.me|グローバルIPアドレス取得|
|cat ファイル名|ファイルを開く|
|mv ファイル名 フォルダ名|ファイルをフォルダに移動|



完成

コマンド 動作
curl ifconfig.me グローバルIPアドレス取得
cat ファイル名 ファイルを開く
mv ファイル名 フォルダ名 ファイルをフォルダに移動



おわりに  

  個人的に、ブログを書く以外にMarkdown形式のファイルを扱わないが、Excelcsvかデータベースかjsonかで一覧表を作ってさえおけば、これでブログ用のテーブルが直ぐに作成できる。  

だが果たして…使うかな…



ちなみに…
こちらで便利なモジュールを紹介されている。

DataFrameをmarkdownの表形式に変換するには?(pytablewriter) - Qiita