見出し画像

Obsidianで日記を振り返るためのmdを書く

はじめに

Obsidianとは

この記事は誰向けか

  • Obsidianを普段から使っている人で

  • Pythonが多少わかる人

  • 特に日記を振り返りたいと思っていたけれど、そのためのMOC(Map Of Contents)を作ってないという方向けです

具体的な構造

環境

  • 今回のコードを実行するにあたって、Jupyter Notebookの環境を利用していますので、そちらをご用意いただくか、それに準ずる形でコードを実行する環境は必要となります

完成品の概要

  • 今回の完成品では下記の様な構造のファイル構造を持ち、月の粒度において、月単位で日記を追いかけられるようになっています

  • 年単位のMOC

    • 年単位の集めた記事のMOC

      • 1月の記事のMOC

        • 1/1

        • 1/2

        • .....

      • 2月の記事のMOC

    • 年単位の日記のMOC

      • 1月の記事のMOC

        • 1/1

        • 1/2

        • ......

      • 2月の記事のMOC

        • ......

コード

事前準備

まずは利用するライブラリを読み込みます。

#  ライブラリの読み込み
import datetime as dt
import jpholiday 
import pandas as pd
from dateutil.relativedelta import relativedelta

import os 

定数や変数の準備

コード内で利用する変数を幾つかは事前に用意しておきました

year = 2023
nextYear = year + 1
lastYear = year -1

filefolder = "Output 環境"

同様にテンプレートを用意する

下のコードでは日記のテンプレートの中でこれを取り上げて表示してほしいというものを使っています。
またMOCにはお互いに上下への移動や横への移動ができるようにリンクを設定しています

year_template = """---
tags: ["{year}年", "MOC"]
---

## Yearwise
### 移動用
[[DiaryMOC_{lastYear}|{lastYear}]] | [[DiaryMOC_{nextYear}|{nextYear}]]
### この年の情報
- [[{year}_気になった記事]]
- [[{year}_今日の日記]]
""".format(year = year, nextYear = nextYear, lastYear = lastYear)
print(year_template)

書き込むためのスクリプト

基本は上書きをしないように、ファイルが有る場合は止めるように構築しています

filename = filefolder  + "DiaryMOC_" + str(year) + ".md"
if os.path.isfile(filename) ==False:
    print(True)
    with open(filename, mode = "w") as f:
        f.write(year_template)
else:
    print("File Exist")

さて後はこれを同じようなものを項目別と、月単位で作成するという構造になっています。

年単位で項目別のコード

関数化したところ

随時関数化はしたりしなかったりしたのですが、それらをまとめるとこんな感じでした

def write_file(filepath, contents, overwrite ):
    if os.path.isfile(filename) ==False or overwrite:
        print("over write is ", True)
        with open(filename, mode = "w") as f:
            f.write(contents)
    else:
        print("File Exist")

def generate_contentslist(year, month, target):
    day = 1
    contentslist = []
    startdate = dt.date(year = int(year), month = int(month), day = day )
    enddate = startdate + relativedelta(months = 1) -relativedelta(days = 1)
    for day in pd.date_range(start=startdate, end = enddate):
        that_date = dt.date(year = day.year, month = day.month, day = day.day)
        
        # 頭に日付を表示する
        contentslist.append("##### [[" + that_date.strftime("%Y-%m-%d")+ "]]" )
        # リンクを表示する
        contentslist.append("![[" + that_date.strftime("%Y-%m-%d") + "#" + targetfile + "]]" )
    
    return contentslist

def add_leading_zero(number):
    return "{:02d}".format(number)

年単位のコード

template1 =  """---
tags: ["{year}年", "MOC"]
---

## Yearwise
### 年ファイルへの移動用
[[DiaryMOC_{year}|{year}]] 
### 並列ファイルへの移動用
"""
#
template2 = """- [[{year}_{target}]]"""

template3 = """### 月ファイルへの移動用"""

### この年の情報
template4 = "- [[{year}{month}_{target}]]"

months = ["01","02","03","04","05","06", 
         "07", "08", "09", "10", "11", "12"]

for targetfile in target_files:
    contentslist = []

    filename = filefolder + str(year) + "_" + str(targetfile) + ".md"
    
    contentslist.append(template1.format(year = year))
    for links in target_files:
        #print(contentslist)
        contentslist.append(template2.format(year = year, target = links))

    contentslist.append(template3)
        
    for month in months:
        contentslist.append(template4.format(year = year, month = month,  target = targetfile))
    
    print("""
""".join(contentslist))
    target_contents = """
""".join(contentslist)
    
    write_file(filename, target_contents, True)
    

月単位のコード

  • ここまでのコードを書けば、あとはどのように繰り返しを作成すれば良いのかはわかるかと思います。ファイル名はそれぞれフォーマットを変えている可能性もありますのでそちらに合わせて修正してください

template1 =  """---
tags: ["{year}年", "MOC"]
---

## Yearwise
### 年ファイルへの移動用
[[DiaryMOC_{year}|{year}]] 
### 並列ファイルへの移動用
"""
#
template2 = """- [[{year}{month}_{target}]]"""

template3 = """### 月ファイルへの移動用"""

### この年の情報
template4 = "- [[{year}{month}_{target}]]"


  • 結局リンクを作成するために細々と修正することになった部分はあります

for targetfile in target_files:
    for month in range(1,13):
        # 初期化処理
        lastMonth  = add_leading_zero(month -1)
        nextMonth  = add_leading_zero(month +1)

        contentslist = []
        filename = filefolder + str(year) + add_leading_zero(month)+ "_" + str(targetfile) + ".md"
        
        # header と年ファイルへの移動用
        contentslist.append(template1.format(year = str(year)))
        
        # 縦の移動
        contentslist.append("""#### 年ファイルに移動する
[[{year}_{target}]]
#### 隣の月に移動する
[[{year}{lastMonth}_{target}]] | [[{year}{nextMonth}_{target}]]""".format(year= str(year), target = targetfile, 
               lastMonth = lastMonth, nextMonth = nextMonth, ))
        # 横の移動
        contentslist.append("""
#### 隣のファイルに移動する""")
        for target in target_files:
            contentslist.append("[[{year}{month}_{target}]]".format(year =str(year), month = add_leading_zero(month), target = target))
            
        
            
        contentslist.append("""
""".join(generate_contentslist(str(year), add_leading_zero(month), targetfile))
                           )
        
        target_contents = """
""".join(contentslist)

        write_file(filename, target_contents, True)

まとめ

まとめ

  • この記事では普段からあんまり日記を振り返ったりしないので、

  • 一気にまとめて日記の一部を振り返られるようにファイルを作成するためのコードを紹介しました

  • かなり同じコードを繰り返してたりするので、これよりも良いコードはあると思うのですが、ご了承ください

今後の展望

  • とりあえずObsidian関連で書いてきたコードはこのぐらいと、あとはflierの内容をスクレイピングするコードぐらいなので、ここまでとさせていただきます。

  • またなにかObsidian関連で面白そうなアイデアがあった際には投稿しますので、また読んでいただけたら嬉しいです

この記事が気に入ったらサポートをしてみませんか?