Qman's Diary

キューマン・エノビクトのブログです。
メインのサイトはこちら: キューマンのコンテンツ置き場
Twitter: @QmanEnobikto

ブログジェネレータのコードを大幅に改善した話

機能自体はそれほど変わっていないのですが、今回、このブログを生成するコードを大幅に変更しました。
これによってわりとまともにブログジェネレータ然としてきた気がします。

変更した点

リポジトリはこちらを参照してください。

formatの使用


insert_code = f'\n<hr><div class="list_content"><p>{day_str}</p><h1><a href="{file_code}">{title_atc}</a></h1></div>' # 挿入するコード

このコードはmain.pyの一部で、ブログのトップページに記事へのリンクを追加する部分です。f'str{variable}strstr{variable}' のようなf-strings(フォーマット済み文字列。文字列中に中括弧で囲った変数付きの置換フィールドを文字列に置き換えることなどができる。Python3.6で追加)を思い切り使っています。
今までは連結演算子+を使って書いていましたが、Discordのbotを友達と作っているときに 友達がバンバンformatメソッドやf-stringsを使うので、私も真似して書いているうちに便利さに気づいてしまい、これを用いて書き換えるに至りました。
友人と書いたコード
友人と書いたコード。formatメソッドやf-stringsが使われている

configの導入

これも同じく友達に影響されました。
今までconfig.pyにTwitterのトークンなどを書かせ、コード内にURLやファイルパスを書かせるという方式のものをGitHubにあげてました。 個人で使う分には良かったのですが、汎用性ははっきり言ってゼロです。そこでconfigの導入に踏み切りました。
Pythonにはconfigparserというものがあり(参考:configparser --- 設定ファイルのパーサー — Python 3.7.4rc2 ドキュメント)、 configparser.ConfigParser().read("config.iniのファイルパス")で読み込むことができます。
まあ、実際に使うときにはconfigparser.ConfigParser()を変数(configなど)に代入してconfig.read("config.iniのファイルパス") のように書くんですが。
そして一度読み込んでしまえば、あとはJSONのようにconfig内の要素をblogurl = config["path"]["blog_url"]のように取り出すことができます。簡単ですね。
参考までに、以下にconfigの書式を示しておきます。中身はこれと同一です。

[path]
blog_folder = REPLACE_HERE
blog_url = REPLACE_HERE

[twitter]
consumer_key = REPLACE_HERE
consumer_secret = REPLACE_HERE
access_token = REPLACE_HERE
access_secret = REPLACE_HERE

コードの整形

ページを生成する際、いくつかに分かれたhtmlファイルを合成しているのですが、その素材部分にインデントを入れていたせいで、合成したときにぐちゃぐちゃになってしまう事態が発生していました。 これをせめて改善するために、インデントを消し、全てのコードを左寄せにしました。見た目はマシになりました。

ディレクトリの生成

今までは完成した記事を出力するディレクトリの生成は各自でやってねというスタイルでしたが、さすがにそれもまずいので、生成するようにしました。
os.makedirs("articles/", exist_ok=True)のように書きました。if節を使わなくてもディレクトリが存在していたらスルーするようにできるのは便利ですね。これも友達から学びました。

画像の移動

記事中に出てくる画像を今までは手動でコピーしなきゃいけませんでしたが、めんどくさいので自動化しました。

まとめ

やはり友人と一緒にbotを作った経験が活きました。友人は自分よりもPythonが上手いので(?)、コードリーディングをして参考にしていきたいと思います。

今後の課題とか

・ファイルのアップロードがやりやすい形にしたい(今よりいいアイデアがある)
・article_baseをちゃんとリセットするようにしたい(自力で消すのめんどい)


ツイート