【記事の編集が楽に!】Pythonで複数のテキスト記事の見出しタグやリストタグを一括で置換してくれるプログラム

PythonでHタグとリストを一括置換 Python

今回のPythonスクリプトは複数記事の見出しとリストタグの一括整形ツールになります。

このプログラムを使えば、フォルダの中にある複数のテキストファイル形式の記事のh1タグ~h4タグとリストタグを一瞬で設定することができるので便利です。

↓のような感じでフォルダにいくつテキストファイルがあっても一括で置換してくれます。

ワードプレスならMarkdown表記が使えますが、#を何回も書いたりするのが面倒なのと、Markdown関連のプラグインを入れるとなぜか頻繁にエラーが起こるので作りました。

指定されたフォルダに入っているテキストファイルの見出しとリストタグをHTML形式に一括置換を行い、別のフォルダに吐き出すプログラムです。

整形条件は次の6つです。文章の中に以下のものが出てきた場合に変換します。

<変換条件1: h1タグ>

(変換前)
#見出し文

(変換後)
<h1>見出し文</h1>

<変換条件2: h2タグ>

(変換前)
##見出し文

(変換後)
<h2>見出し文</h2>

<変換条件3: h3タグ>

(変換前)
○見出し文

(変換後)
<h3>見出し文</h3>

<変換条件4: h4タグ>

(変換前)
□見出し文

(変換後)
<h4>見出し文</h4>

<変換条件5: リストタグ>

(変換前)
・文のまとまり1
・文のまとまり2
・文のまとまり3

(変換後)
<ul>
<li>文のまとまり1</li>
<li>文のまとまり2</li>
<li>文のまとまり3</li>
</ul>

(項目数は2つ以上)

<変換条件6: 数字付きリストタグ>

(変換前)
1.文のまとまり1
2.文のまとまり2
3.文のまとまり3

(変換後)
<ol>
<li>文のまとまり1</li>
<li>文のまとまり2</li>
<li>文のまとまり3</li>
</ol>

(項目数は2つ以上)

フォルダに入っている複数のテキストを一括で上記規則に従って変換してくれるので便利です。

(注意点:○、□はそれぞれ記号です。(間違えを避けるために最初はコピペすることをおすすめします。)

リスト項目を記述する際に項目間に空白行を入れないで下さい。また、リスト項目の終わりには必ず空白行を入れて下さい。)

今すぐ使ってみたい方はこちら

(5から10分程度の簡単な設定で使えるようになります。)

あと、出来上がった記事はこちらのプログラムで一括でアップロードすると楽に投稿できます↓
【簡単に記事投稿完了】Pythonでワードプレスに複数の記事を一括で自動投稿してくれるプログラム

本文の記号の見出しを自動置換するプログラムのソースコード

ファイル名:main.py

# coding: utf-8

import os
import re


BASE_DIR = os.path.dirname(os.path.abspath(__file__))
INPUT_DIR = os.path.join(BASE_DIR, 'input')
OUTPUT_DIR = os.path.join(BASE_DIR, 'output')


def convert_header(text):
    '''
    '#'、'##'、'○'、'□'をHTMLタグに変換
    '''

    res = re.search('^(#+)(.*)', text)  # '#'、'##'を除去
    res2 = re.search('^○{1}(.*)', text)  # '○'を除去
    res3 = re.search('^□{1}(.*)', text)  # '□'を除去

    # '#'、'##'の処理
    if res:
        return '<h{num}>{title}</h{num}>\n'.format(num=len(res[1]), title=res[2])

    # '○'の処理
    if res2:
        return '<h3>{title}</h3>\n'.format(title=res2[1])

    # '□'の処理
    if res3:
        return '<h4>{title}</h4>\n'.format(title=res3[1])


def convert_list(lst, is_ordered=False):
    '''
    '・'のリスト、数字のリストをHTMLタグに変換
    '''

    # 数字のリストの処理(開始タグ)
    if is_ordered:
        result = '<ol>\n'

    # '・'のリストの処理(開始タグ)
    else:
        result = '<ul>\n'

    # liタグにまとめる
    for s in lst:
        result += '\t<li>{}</li>\n'.format(s)

    # 数字のリストの処理(終了タグ)
    if is_ordered:
        result += '</ol>\n'

    # '・'のリストの処理(終了タグ)
    else:
        result += '</ul>\n'

    return result


if __name__ == "__main__": # メインの処理

    for file_name in os.listdir(INPUT_DIR): # inputフォルダからファイルを1つずつ取り出す
        print(file_name)

        # outputフォルダ内にfile_name名で開く
        with open(os.path.join(OUTPUT_DIR, file_name), 'w', encoding='cp932') as wf:
            # inputフォルダ内にあるfile_name名のファイルを開く
            with open(os.path.join(INPUT_DIR, file_name), encoding='cp932') as rf:

                tmp = ''
                is_ordered = None
                lst = []

                for l in rf.readlines(): # 1行ずつ読み出す
                    # 数字のリストの処理
                    if re.search('^[0-9]+\.', l):
                        is_ordered = True # is_orderedにTrueを代入
                        lst.append(re.search('^[0-9]+\.(.*)', l)[1]) # lst変数に数字のリストを除いた文字列を追加

                    # '・'のリストの処理
                    elif re.search('^・', l):
                        is_ordered = False # is_orderedにFalseを代入
                        lst.append(re.search('^・(.*)', l)[1]) # lst変数に'・'のリストを除いた文字列を追加

                    # '#'、'##'の処理
                    elif re.search('^#', l):
                        tmp = convert_header(l) # convert_header関数を実行

                    # '○'の処理
                    elif re.search('^○', l):
                        tmp = convert_header(l) # convert_header関数を実行

                    # '□'の処理
                    elif re.search('^□', l):
                        tmp = convert_header(l) # convert_header関数を実行

                    # 開始シンボルのない文字列、空行の処理
                    else:
                        if is_ordered is not None: # リスト(数字、'・')の変換
                            tmp = convert_list(lst, is_ordered) # convert_list関数を実行
                            wf.write(tmp)
                            lst = []
                            is_ordered = None # is_orderedにNoneを代入
                            tmp = l
                        else:
                            tmp = l # 開始シンボルのない文字列、空行をtmpに代入

                    # 書き出し処理
                    # is_orderedがNoneの場合は書き出す
                    if is_ordered is None:
                        wf.write(tmp)

# の後の文章はコメントアウトされます。

Pythonにワードプレスで自動投稿するソースコードの詳細な解説

ではここからソースコードの詳細な解説に移りたいと思います。

まずはmain.pyの中で使うライブラリのインポート

3~4行目:

import os
import re

今回の3~4行目でimportしています。

osライブラリ

3行目:
import os

Pythonに最初から入っている標準ライブラリです。
ファイルやパスの名前といった文字列を操作する時に使われます。
osライブラリについて

reモジュール

4行目:
import re

reモジュールでは正規表現でオブジェクトの検索、置換、連結、分割など様々な処理を行うことができます。
こちらもPythonに最初から入っている標準ライブラリです。

ディレクトリ名=BASE_DIR

7行目:
BASE_DIR = os.path.dirname(os.path.abspath(__file__))

os.path.dirname()

は()内のフォルダ名を取得する関数です。

現在実行しているPythonプログラムの相対パスを取得

__file__

Pythonで現在実行しているスクリプト〇〇.pyの場所(=パス)を取得します。
ただし__file__で得られるのは、今いるディレクトリ(=ファイル)からの相対パスになります。

相対パスとは?

今いるディレクトリを基準にして、目的のディレクトリがどこにあるかを示します。
相対パスの記述には、3パターンあります。

・同じ階層内にあるファイル=「ファイル名」
・同じ階層内だが別フォルダにあるファイル=「フォルダ名/ファイル名」
・今の階層の1つ上の階層にあるファイル=「../ファイル名」
(※2つ上の階層にあるファイルの場合=「../../ファイル名」)

(例)/Users/my-project/data/〇〇.pyの場合
作業しているディレクトリが/my-project/で、
下の階層に実行中のスクリプト〇〇.pyがある場合
相対パス=data/〇〇.py

絶対パスに変換するos.path.abspath()関数

os.path.abspath(__file__)

os.path.abspath()関数は()内のパスを、絶対パスに変換する関数です。

絶対パスとは?

階層のスタートから目的のディレクトリまでの構造が完全に示されています。
スタート地点はルートディレクトリという、一番上のディレクトリになります。

(例)/Users/my-project/data/〇〇.pyの場合
絶対パス=/Users/my-project/data/〇〇.py
ルートディレクトリはこの頂点にある「/」を指します。

ディレクトリ名を取得するos.path.dirname()関数

os.path.dirname()

()で実行中のファイルが格納されているディレクトリ名を取得します。
()には、os.path.abspath(__file__)という絶対パスが入ります。

(例)/Users/my-project/data/〇〇.pyの場合
os.path.dirname(/Users/my-project/data/〇〇.py)

このような形になりますので、
/Users/my-project/data
というディレクトリ名を得ることができます。

BASE_DIR = ‘/Users/my-project/data’
こうして取得したディレクトリ名がBASE_DIRという変数に代入されます。

パスの要素を結合するos.path.join関数

8行目:
INPUT_DIR = os.path.join(BASE_DIR, 'input')

os.path.join()

は()内のパスの要素を結合するコードです。
今回の場合、BASE_DIRとinputパスが結合されます。

(例)BASE_DIR = /Users/my-project/data の場合
/Users/my-project/data/input
となり、INPUT_DIRという変数に代入されます。

同様に

9行目:
OUTPUT_DIR = os.path.join(BASE_DIR, 'output')

上記の行では、BASE_DIRとoutputパスが結合されるので、
/Users/my-project/data/output
となり、OUTPUT_DIRという変数に代入されます。

2つの関数を定義する

Pythonでは、def文を用いて関数を定義します。
defとは、define(定義する)という英語からきています。
関数の構成は、下記のような記述となるので、覚えておきましょう。

def 関数名(引数1, 引数2, ..., 引数n):

(処理文)
return 戻り値

main.pyの中では、convert_header関数とconvert_list関数を定義しています。

関数の定義①convert_header

12~31行目:

def convert_header(text):
'''
'#'、'##'、'○'、'□'をHTMLタグに変換
'''

res = re.search('^(#+)(.*)', text) # '#'、'##'を除去
res2 = re.search('^○{1}(.*)', text) # '○'を除去
res3 = re.search('^□{1}(.*)', text) # '□'を除去

# '#'、'##'の処理
if res:
return '<h{num}>{title}</h{num}>\n'.format(num=len(res[1]), title=res[2])

# '○'の処理
if res2:
return '<h3>{title}</h3>\n'.format(title=res2[1])

# '□'の処理
if res3:
return '<h4>{title}</h4>\n'.format(title=res3[1])

見出しのある箇所を探す

17~19行目:

res = re.search('^(#+)(.*)', text) # '#'、'##'を除去
res2 = re.search('^○{1}(.*)', text) # '○'を除去
res3 = re.search('^□{1}(.*)', text) # '□'を除去

・re.search()
re.search関数は文字列すべてを検索対象として、()内の条件にマッチするものを返します。

^(#+)(.*)

の部分は正規表現を使っています。^は文頭を表します。

使われている正規表現を説明すると、

・「+」は前の文字の1回以上の繰り返しなので、

#+で#の1回以上の繰り返しを表します。

・「.」は任意の1文字

・*は前の文字の0回以上の繰り返しなので、

「.*」で0文字以上の任意の文字列を表します。「.*」はよく使われる表現なのでこのまま覚えてしまえばいいです。

17行目:
res = re.search('^(#+)(.*)', text)

において、文字列の先頭に#が1回以上含まれるものを探します。今回のre.searchによって指定されている条件は以下の2つです。
res[1]=(#+)(.*)の記号
res[2]=text(文字)

(例)text = ‘##見出し’の場合
res[1] = ‘##’
res[2] = ‘見出し’

format()関数で見出しの種類を判別する

23行目:

return '<h{num}>{title}</h{num}>'.format(num=len(res[1]), title=res[2])

・len()
文字列を()内の引数とすると文字列の文字数を出力する関数です。

(例)text = ‘##見出し’の場合
res[1] = ‘##’
となり、文字数は2つなので
len(res[1]) = 2

title = res[2] = ‘見出し’

‘<h2>見出し</h2>’となり、<h2>の見出しタグが完成しました。

convert_list関数

34~59行目:

def convert_list(lst, is_ordered=False):
'''
'・'のリスト、数字のリストをHTMLタグに変換
'''

# 数字のリストの処理(開始タグ)
if is_ordered:
result = '<ol>\n'

# '・'のリストの処理(開始タグ)
else:
result = '<ul>\n'

# liタグにまとめる
for s in lst:
result += '\t<li>{}</li>\n'.format(s)

# 数字のリストの処理(終了タグ)
if is_ordered:
result += '</ol>\n'

# '・'のリストの処理(終了タグ)
else:
result += '</ul>\n'

return result

はじめに<ul>または<ol>を代入

39~45行目:

# 数字のリストの処理(開始タグ)
    if is_ordered:
        result = '<ol>\n'

    # '・'のリストの処理(開始タグ)
    else:
        result = '<ul>\n'

まずはじめに、以下の内容がresultに代入されます。
‘<ul>\n’ = 文字列'<ul>’と改行を指示する’\n’

または

‘<ol>\n’ = 文字列'<ol>’と改行を指示する’\n’

liタグにまとめる

liタグにまとめるために、こちらの関数を実行します。

49行目:
result += '\t<li>{}</li>\n'.format(s)

\tはタブキーの挿入を意味しています。

(例)s = ‘文のまとまり1’
result += ‘\t<li>{}</li>\r\n’.format(‘文のまとまり1’)
resultには、'<li>文のまとまり1</li>’が追記されます。

(例)lst = [‘文のまとまり1’, ‘文のまとまり2’, ‘文のまとまり3′]
is_orderedがFalseの条件では、result変数は以下のようになります。
<ul>
<li>文のまとまり1</li>
<li>文のまとまり2</li>
<li>文のまとまり3</li>’

</ul>あるいは</ol>で〆る

51~57行目:

# 数字のリストの処理(終了タグ)
if is_ordered:
result += '</ol>\n'

# '・'のリストの処理(終了タグ)
else:
result += '</ul>\n'

文字列'</ul>’あるいは</ol>と改行を指示する’\n’を組み合わせresultに追記します。

(例)lst = [‘文のまとまり1’, ‘文のまとまり2’, ‘文のまとまり3’]
result変数は以下のようになります。
<ul>
<li>文のまとまり1</li>
<li>文のまとまり2</li>
<li>文のまとまり3</li>
</ul>

あるいは

<ol>
<li>文のまとまり1</li>
<li>文のまとまり2</li>
<li>文のまとまり3</li>
</ol>

59行目:
return result

最後に、return resultによってtmpにresult変数の値が代入されます。

ifの条件を設定する

62行目:
if __name__ == "__main__":

62行目以下が、if文を使ったこのスクリプトのメインの処理です。
main.pyを実行すると、__name__には”__main__”という値が代入されるので、
if文がTrueとなり、64行目以下の処理が実行されます。

もし、違うスクリプトでmain.pyをimportしてmain.pyに記述された関数を使用したい場合、

import main

のように書きますが、他のスクリプトからimportして読み込んだ場合は__name__には
ファイル名である”main”という値が代入されるので、
if文がFalseとなり、64行目以下の処理は実行されません。

つまり、main.pyを直接実行した時だけ、64行目以下のメイン処理が実行されます。

64〜113行目

for file_name in os.listdir(INPUT_DIR): # inputフォルダからファイルを1つずつ取り出す
print(file_name)

# outputフォルダ内にfile_name名で開く
with open(os.path.join(OUTPUT_DIR, file_name), 'w', encoding='cp932') as wf:
# inputフォルダ内にあるfile_name名のファイルを開く
with open(os.path.join(INPUT_DIR, file_name), encoding='cp932') as rf:

tmp = ''
is_ordered = None
lst = []

for l in rf.readlines(): # 1行ずつ読み出す
# 数字のリストの処理
if re.search('^[0-9]+\.', l):
is_ordered = True # is_orderedにTrueを代入
lst.append(re.search('^[0-9]+\.(.*)', l)[1]) # lst変数に数字のリストを除いた文字列を追加

# '・'のリストの処理
elif re.search('^・', l):
is_ordered = False # is_orderedにFalseを代入
lst.append(re.search('^・(.*)', l)[1]) # lst変数に'・'のリストを除いた文字列を追加

# '#'、'##'の処理
elif re.search('^#', l):
tmp = convert_header(l) # convert_header関数を実行

# '○'の処理
elif re.search('^○', l):
tmp = convert_header(l) # convert_header関数を実行

# '□'の処理
elif re.search('^□', l):
tmp = convert_header(l) # convert_header関数を実行

# 開始シンボルのない文字列、空行の処理
else:
if is_ordered is not None: # リスト(数字、'・')の変換
tmp = convert_list(lst, is_ordered) # convert_list関数を実行
wf.write(tmp)
lst = []
is_ordered = None # is_orderedにNoneを代入
tmp = l
else:
tmp = l # 開始シンボルのない文字列、空行をtmpに代入

# 書き出し処理
# is_orderedがNoneの場合は書き出す
if is_ordered is None:
wf.write(tmp)

解説

64~65行目:

for file_name in os.listdir(INPUT_DIR):
print(file_name)

INPUT_DIRフォルダにあるファイルをfor文で1つずつ取り出します。
そしてそれをprintで出力します。

68行目:

with open(os.path.join(OUTPUT_DIR, file_name), 'w', encoding='cp932') as wf:

OUTPUT_DIR/file_nameというファイルを、wfという名前で開きます。
‘w’は「書き込みモード」という意味になります。
読み書きの際に使用する文字コードをcp932で指定しています。(cp932はShift_JISとほぼ同じだと思ってもらって構いません。)

70行目:

with open(os.path.join(INPUT_DIR, file_name), encoding='cp932') as rf:

INPUT_DIR/file_nameというファイルをrfという名前で開きます。
文字コードはcp932です。

モードを指定していないので「読み込みモード」になります。

72~74行目:

tmp = ''
is_ordered = None
lst = []

tmp変数に空文字を代入して初期化します。
is_ordered変数にNoneを代入して初期化します。
lst変数に空のリストを代入して初期化します。

76行目:
for l in rf.readlines():

rf.readlines()

readlines()メソッドはファイルを1行ごとに読み込みリストとして返すので、ここではINPUT_DIR/file_nameというファイルを1行ごとに読み込んだものをリストとして返します。

返されたリストをfor文で処理し、1行ずつ l という変数に代入してfor文以下の処理を行っていきます。

if-elif-elseについて

if [条件式1]:
[条件式1がTrueのときに行う処理]
elif [条件式2]:
[条件式2がTrueのときに行う処理]
else:
[条件式1もelifの条件式2もどちらもFalseのときに行う処理]

else if文について詳しくは過去の記事をご覧ください。

今回のif-elif-else

78~113行目:

if re.search('^[0-9]+\.', l):
is_ordered = True # is_orderedにTrueを代入
lst.append(re.search('^[0-9]+\.(.*)', l)[1]) # lst変数に数字のリストを除いた文字列を追加

# '・'のリストの処理
elif re.search('^・', l):
is_ordered = False # is_orderedにFalseを代入
lst.append(re.search('^・(.*)', l)[1]) # lst変数に'・'のリストを除いた文字列を追加

# '#'、'##'の処理
elif re.search('^#', l):
tmp = convert_header(l) # convert_header関数を実行

# '○'の処理
elif re.search('^○', l):
tmp = convert_header(l) # convert_header関数を実行

# '□'の処理
elif re.search('^□', l):
tmp = convert_header(l) # convert_header関数を実行

# 開始シンボルのない文字列、空行の処理
else:
if is_ordered is not None: # リスト(数字、'・')の変換
tmp = convert_list(lst, is_ordered) # convert_list関数を実行
wf.write(tmp)
lst = []
is_ordered = None # is_orderedにNoneを代入
tmp = l
else:
tmp = l # 開始シンボルのない文字列、空行をtmpに代入

# 書き出し処理
# is_orderedがNoneの場合は書き出す
if is_ordered is None:
wf.write(tmp)

[条件式1] = if re.search(‘^[0-9]+\.(.*)’, l):

lの中から先頭が数字で始まり、「.」が来るようなものを探します。

[条件式2] = elif re.search(‘^・’, l):

lの中から先頭が’・’で始まるようなものを探します。

[条件式3] = elif re.search(‘^#’, l):

lの中から先頭が’#’で始まるようなものを探します。

[条件式4] = elif re.search(‘^○’, l):

lの中から先頭が’○’で始まるようなものを探します。

[条件式5] = elif re.search(‘^□’, l):

lの中から先頭が’□’で始まるようなものを探します。

①’数字.**’のようなパターン

l = ‘1.文のまとまり1’
のように、’数字.**’のような形式になっている場合

条件式1がTrueになるので、if文内の処理が実行されます。
79~80行目:

is_ordered = True
lst.append(re.search('^[0-9]+\.(.*)', l)[1])

・is_orderedをTrueにします
・lst変数に’数字.’を除いた文字列を追加します
(l = ‘1.文のまとまり1’なら’文のまとまり1’が追加されます)
elif、else文はスキップされます。

112行目:
if is_ordered is None:

はis_orderedがTrueになっているのでスキップされます。

次のfor文が実行されます。

l = ‘2.文のまとまり2’
のようになっていたら同じ処理が繰り返されます。
このとき、lst変数は
lst = [‘文のまとまり1’, ‘文のまとまり2’]
のようになっています。

112行目:
if is_ordered is None:

はis_orderedがTrueになっているのでスキップされます。

l = ”(改行のような場合)
のようになっていたらelse文にジャンプし、
is_orderedがTrueなので
if文の処理が実行されます。

convert_list関数で
<ol>
<li>文のまとまり1</li>
<li>文のまとまり2</li>
<li>文のまとまり3</li>
</ol>
がtmpに代入されます。

lst変数に空のリストを代入して初期化します。
is_ordered変数にNoneを代入して初期化します。

112~113行目:

if is_ordered is None:
wf.write(tmp)

tmpがOUTPUT_DIR/file_nameというファイルに書き込まれます。

②’・**’のようなパターン

l = ‘・文のまとまり1’のように、’・**’のような形になっている場合

1個目のelif文(=条件式2)がTrueになるので、elif文内の処理が実行されます。

83~85行目:

elif re.search('^・', l):
is_ordered = False
lst.append(re.search('^・(.*)', l)[1])

・is_orderedをFalseにします
・lst変数に’・’を除いた文字列を追加します
l = ‘・文のまとまり1’の場合、’文のまとまり1’がlstに追加されます。
条件式1及び条件式3以下はスキップされます。

112行目:
if is_ordered is None:

はis_orderedがTrueになっているのでスキップされます。

次のfor文が実行されます。

次のlがl = ‘・文のまとまり2’のようでしたら、同じ処理が繰り返されます。
このとき、lst変数はlst = [‘文のまとまり1’, ‘文のまとまり2’]
のようになっていきます。

次のlがl = ”のように改行などの場合、
else文にジャンプし、is_orderedがFalseなので
if文の処理が実行されます。

102行目:
tmp = convert_list(lst, is_ordered)

convert_list関数で
<ul>
<li>文のまとまり1</li>
<li>文のまとまり2</li>
<li>文のまとまり3</li>
</ul>
がtmpに代入されます。

104行目:
lst = []

lst変数には、空のリストを代入して初期化します。

105行目:
is_ordered = None

is_ordered変数には、Noneが代入されます。
よって、下のif is_ordered is None:が実行されます。

112~113行目:

if is_ordered is None:
wf.write(tmp)

tmpがOUTPUT_DIR/file_nameというファイルに書き込まれます。

③’#**’のようなパターン

l = ‘#見出し文’や、l = ‘##見出し文’のように、’#**’のような形になっている場合。

条件式3がTrueになるので、elif文内の処理が実行されます。

elif文内はconvert_header関数でtmpには
<h1>見出し</h1>
あるいは
<h2>見出し</h2>
が代入されます。

条件式1~2及び条件式4以降はスキップされます。

112行目:
if is_ordered is None:

が実行されるのでtmpがOUTPUT_DIR/file_nameというファイル名で書き込まれます。

④’〇**’のようなパターン

l = ‘〇見出し文’のように、’〇**’のような形になっている場合。

条件式4がTrueになるので、elif文内の処理が実行されます。

elif文内はconvert_header関数でtmpには
<h3>見出し</h3>
が代入されます。

条件式1~3及び条件式5以降はスキップされます。

112行目:
if is_ordered is None:

が実行されるのでtmpがOUTPUT_DIR/file_nameというファイル名で書き込まれます。

⑤’□**’のようなパターン

l = ‘□見出し文’のように、’□**’のような形になっている場合。

条件式5がTrueになるので、elif文内の処理が実行されます。

elif文内はconvert_header関数でtmpには
<h4>見出し</h4>
が代入されます。

条件式1~4及びelseはスキップされます。

112行目:
if is_ordered is None:

が実行されるのでtmpがOUTPUT_DIR/file_nameというファイル名で書き込まれます。

⑥開始シンボルのない文字列または空行のパターン

行頭に①~⑤のような開始シンボルがない場合(または空行の場合)。
else文が実行され、条件式1~5はスキップされます。

else文が実行されます。

is_orderedがnot None(つまり<ul>か<ol>)ならば

102行目:
tmp = convert_list(lst, is_ordered) # convert_list関数を実行

でそれまで追記していたlstの内容をリスト(数字、’・’)に変換する処理が実行されます。
その後に

103行目:
wf.write(tmp)

で変換された内容がファイルに書き込まれ
104~106行目:

lst = []
is_ordered = None # is_orderedにNoneを代入
tmp = l

で次の処理の準備を行います。

is_orderedがNone(つまり開始シンボルのない文字列や空行)ならば

108行目:
tmp = l # 開始シンボルのない文字列 空行をtmpに代入

で文字列をtmpに代入します。

書き出し処理

110~113行目:

# 書き出し処理
# is_orderedがNoneの場合は書き出す
if is_ordered is None:
wf.write(tmp)

is_orderedがNone(つまり開始シンボルのない文字列や空行)ならば

113行目:
wf.write(tmp)

でtmpの内容がファイルに書き込まれます。

すぐに使いたい方向けのマニュアル

1.パソコンにPythonをインストールしていない方は、まず下記のリンクを見ながらPythonをインストールします。

Windowsの方はこちら

Macの方はこちら

2.マイドキュメントなどに適当な名前のフォルダを作り、その中に新規テキストファイル(.txt)を作成、プログラムのソースコードを張り付けて、拡張子を.txtから.pyに変換してmain.pyという名前で保存します。

あらかじめプログラムmain.pyを置いたフォルダ内にinputとoutputという名前のフォルダを作り、inputフォルダに見出しとリストタグを自動置換したい複数のテキストファイルを入れておきます。(この時点でoutputフォルダは空。)

見出しとリストタグの置換ルールは下記↓を参照して下さい。
inputフォルダに入れる見出しとリストタグのつけ方のルール

3.Windowsならコマンドプロンプト、Macならターミナルを開きファイルを置いてあるパス(URL)へ移動します。

移動の方法はコマンドプロンプトでもターミナルでも

cd ファイルが置いてあるパス

のコマンドで移動できます。

4.コマンドプロンプト、またはターミナルで

カレントディレクトリにいることを確認して

Python main.py

と入力してEnterを押します。

これで記事の置換が完了していることが確認できたら終了です。

エラー報告はコメント欄にお願いいたします。

コメント

タイトルとURLをコピーしました