2021年3月31日水曜日

3日かけて作ったPythonスクリプトが2秒でお役目終了になった

「6時間かけて作った動画は約3分」みたいなやつすぎて拍子抜けした……。

Pythonの勉強もかねて自サイトの更新処理をPythonで書いてるという話の続き。
特にPythonの解説とかそういうやつではないです。日記です。

今までBashでテンプレ合成するスクリプトを作って生成していた個別ページHTMLについて、
次デザインでちょっとだけテンプレが変わったのでBashで流すのがちょっと面倒で、
勉強もかねてPythonで一括変換したということなんだけど、

タイトルの通り3日かけて作ったPythonが2秒で処理終わってお役目終了になってしまって悲しいやら嬉しいやら。それだけです。
成功したので嬉しいことは嬉しいよ。

Bash自動化した回で↑この部分からキャプションの文字列だけを別ファイルで保存するスクリプトを作っていて、特に分けておいても役に立たないよな〜と思ったら今ここですっごい役に立っててすごい。

ファイル構成がこんなやつで↓

caption/    (拡張子外したテキストファイル)
        └abs00
        └abs01
        └...計100個以上
page/     (テンプレに流した後のHTMLをここに保存する)
        └template.html
.database    (ID@タイトル@投稿日付@タグ というフォーマットで書かれたCSVもどき)

.databaseの中身がこんな感じで↓

frac054.jpg@Break Rusty Window@2018.12.01@#frac
frac055a.gif@Dogfight of Two Wizards (Animation)@2018.12.11@#frac #motion
frac055.jpg@Dogfight of two Wizards@2018.12.10@#frac
frac057.jpg@The moment thunder is born@2019.01.11@#frac 

で、Pythonがこんなやつ↓(コメントが……)

#!/usr/bin/python
import datetime
import os
import re
import sys
import shutil
from jinja2 import Environment, FileSystemLoader, Template
from PIL import Image, ImageTk
from ftplib import FTP

HOME = os.environ["HOME"] +"/"
DEST = os.environ["SITE"] +"/"

env = Environment(loader=FileSystemLoader('./', encoding="utf8"))

# Captionフォルダにあるキャプションデータを全部今のテンプレに流し込みたい!
# Jinjaを使ってDatabaseからIDを引っ張ってCaptionフォルダから該当テキストを引っ張ってきて
# 変数に入れてテンプレに流し込んでくれ

# Captionデータの一覧
filelist = os.listdir(DEST+ "caption")

# frac002 などのIDがヒットする
for name in filelist:
# makedatabaseで作ったデータを引っ張ってくる
# 読み込み
db = open(DEST + ".database", "r")
dblist = db.readlines()
db.close()
# Forでデータベース一行ずつ実行
for matched in dblist:
# FilelistのForで出しているディレクトリ内リストとマッチするか
if matched.find(name) >= 0 : 
# frac002@sample@2021.00.00@#tag #tag2
# AWKで切って変数に納する的なやつ 🥤
splitdb = matched.split("@")
db_id    = str(splitdb[0])
db_title = str(splitdb[1])
db_date  = str(splitdb[2])
db_tag   = re.sub("\n", "" ,str(splitdb[3]))
# ヒットしたキャプションをファイルからロード
capfile = open(DEST + "caption/"+ name, "r")
caption = capfile.read()
capfile.close()
# キャプションのBRタグとインデント自動挿入、まずbrから (コピペ
caption_br = re.sub(
"$",
"<br>",
caption,
flags=re.MULTILINE
)
# インデント
caption_br = re.sub(
"^",
"\t\t",
caption_br,
flags=re.MULTILINE
)
# 流し込みのためのデータ作成 
data = {
"id": db_id,
"title": db_title, 
"date": db_date,
"tag": db_tag,
"caption": caption_br
}

# テンプレート読み込み
f = open(DEST + "page/template.html", "r")
tmptext = f.read();
template = Template(tmptext)

# テンプレート流し込み
rendered = template.render(data)

# 流し込んだものをファイル出力
output = open(DEST+"page/"+ name +".html", "w")
output.write(rendered)
output.close()

PythonでGrepみたいにマッチ文字列に対してどうたら…というのは https://orebibou.com/ja/home/201612/20161215_001/ が参考になった。
よく分からんままとりあえず書いてたけど、結局はifで合致するかどうかをforで全項目に対して繰り返しているだけらしい。

0 件のコメント:

コメントを投稿