Jupyter Notebook(.ipynb)の内容を画像も含めてそのままQiitaへ投稿する方法 (スクリプト)

# JupyterのMarkdownをQiitaへ投稿

Jupyter Notebookの内容を「File → Export」機能により「Markdown」形式でエクスポートすると、得られる.mdファイルの内容をそのままQiitaに貼り付けて投稿できるので、とても便利です。

ただ、Notebookで描画したグラフなどの画像がある場合は、画像へのリンクアドレスがQiitaへ投稿すると違ってくるので、書き換える必要があります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/606924/3fbb2cbc-909d-7cb4-3909-987af5af838e.png)

# 画像も含めてそのままQiitaへ投稿する

そこで、画像をQiitaへ投稿・画像のリンクアドレスを書き換え、を行うスクリプトを試作してみます。

# 投稿の仕方

Jupyter Notebookの内容を「File → Export」から「Markdown」形式でエクスポート。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/606924/21be7185-f4a7-c317-45fb-26e7ee5f5a80.png)
　↓
Notebookに画像がある場合は、.zipファイルが得られます。この中身の、.mdファイル①と、その他の画像ファイル(.png)全て②、を以降で使います。
　↓
後段に掲載の「conv_jupyter_md_pic_to_qiita.py」ファイルと同じフォルダに、.zipの中の.mdファイル①を配置。(任意の名前でOK、1個の.mdだけ配置)
　↓
Qiitaで新規投稿→記事を作成し、新しい編集ページ枠の上へ、.zipの中の画像ファイル(.png)全て②をドラッグアンドドロップ。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/606924/09cc4d74-e38e-329a-b6ad-5e9c4828c084.png)
　↓
画像がアップロードされ、Markdownのリンク文字列が生成されるので、これを全て選択して切り取り、.txtファイル③を新規に用意して貼り付けて保存。
　↓
「conv_jupyter_md_pic_to_qiita.py」ファイルと同じフォルダに、.txtファイル③を配置。(任意の名前でOK、1個の.txtだけ配置)
　↓
スクリプト「conv_jupyter_md_pic_to_qiita.py」を実行。
　↓
.mdファイル①のファイル名に.convが付いた.mdファイル④が新しく作成され、この中には、画像のリンクアドレスがQiitaへ投稿した画像のものに変換されたMarkdownが出力されています。
　↓
生成された.mdファイル④の内容をすべてコピーして、Qiitaの編集ページへ貼り付けます。Qiitaのプレビューに画像も合わせて表示されます。

# 画像のリンクアドレスを書き換えるスクリプト.pyコード

```python:conv_jupyter_md_pic_to_qiita.py
# -*- coding: utf-8 -*-

# Jupyter Notebookでダウンロード(エクスポート)したMarkdown(.zipファイル)を
# Qiitaで公開するために、画像パスを置換。

# Markdown(.zipファイル)の中にある画像ファイルは、Qiitaの編集ページで
# すべてドラッグアンドドロップ、その時に出てくる画像表示のMarkdownを
# テキストファイルに保存して、このスクリプトで置換。

import pathlib, re

# sec: main

def main(): # 実行切替用
    run__main1()

def run__main1():

    # sec: path
    
    path_md = None
    for path_md in pathlib.Path(".").glob("*.md"): break

    print("load:", path_md)
    if path_md is None: # if: 該当なし
        return
    
    path_qi = None
    for path_qi in pathlib.Path(".").glob("*.txt"): break

    print("load:", path_qi)
    if path_qi is None: # if: 該当なし
        return
    
    # sec: load Qiita-pic-list
    
    with path_qi.open(mode='r', encoding="UTF8") as file:
        lines_qi = file.readlines()
    
    # sec: make list
    
    re_pic = re.compile(r"!\[([^\]]+)\]\(([^)]+)\)") #" Qiitaコード色付けが不調の為
    qi_pic_list = []
    for line in lines_qi:
        
        if len(line) <= 0:
            continue
        
        matched = re_pic.match(line)
        if matched is None: # if: 画像のMarkdownと不一致
            print("エラー: 画像のMarkdownと不一致", line)
            return
        
        qi_pic_list.append( (matched.group(1), matched.group(2)) )

    print("conv:", len(lines_qi))
    
    re_pic = None
    lines_qi = None
    
    # sec: conv
    
    text_md = path_md.read_text(encoding="UTF8")
    for name, addr in qi_pic_list:
        text_md = text_md.replace("![png](%s)" % name, "![%s](%s)" % (name, addr))
    
    # sec: output
    
    path_md_out = path_md.with_name("%s.conv%s" % (path_md.stem, path_md.suffix))
    path_md_out.write_text(text_md, encoding="UTF8")

    print("output:", path_md_out)
    
# sec: entry

if __name__ == "__main__": main()
```

# コードの概要

1. カレントディレクトリにあるMarkdownファイル（.md）を読み込む。
2. カレントディレクトリにあるQiita用画像Markdown一覧（.txt）を読み込む。
このテキストファイルには、Qiitaにドラッグアンドドロップでアップロードした画像のMarkdown形式（例：`![output_1_0.png](https://qiita-image-url...)`）が記述されていると想定。
3. Markdown本文中の画像リンク（例：`![png](output_1_0.png)`）を、Qiita形式（例：`![output_1_0.png](https://...)`）に置換。
4. 変換後のMarkdownファイルを別ファイルとして保存。