![見出し画像](https://assets.st-note.com/production/uploads/images/110716323/rectangle_large_type_2_2572fe97e6b092fb168c7f2a90ef9f5b.png?width=800)
SNS投稿テキストの自動作成
フォルダに存在する画像のファイル名を読み取ってSNS用の投稿テキストを自動作成する方法について紹介します。
ChatGPT君をフル活用しますよ!
pythonは実行できるという人はすぐ試せます
pythonが実行できないという人は、、、すみません、ChatGPT君に聞いてください。
ChatGPTを使ったことがないという人は、ChatGPTの有用性をこの記事で学んでぜひ一度ChatGPTを使ってみてください。
前提条件
私は過去作品をこのようにファイル名で管理しています。
「シリーズ名#番号_日本語タイトル-英語タイトル」
![](https://assets.st-note.com/img/1689257328543-IqIA6YxdjT.png?width=800)
今回はInstagramの投稿テキストを作成します。
![](https://assets.st-note.com/img/1689257432119-sh5mGFtJGd.png?width=800)
普通に作るとなるとファイル名をコピーしてテンプレの内容に入れ替えとちょっと手間がかかってしまいます。
これを何十ファイルも繰り返すのはちょっとしんどいので自動化してみましょう。
ChatGPTを使うときの心得
基本的に一発で最終成果物を得ることを期待しません。
対話を通して改善することで最終成果物に近づけていくというのが重要です。
何かわからないことがあったらしつこくChatGPT君に聞きましょう。
内容をもっと説明してもらったり、自分の理解を確かめることも重要です。
それが指示の精度を改善して最終的な成果物に近づけます。
自動化方法
ここからは私とChatGPT君とのやり取りを時系列で紹介していきます。
指示1「それっぽいの作って」
(私は慣れてるので最初の指示から難易度高いかも…)
指定したフォルダのファイル名を読み取りファイル名に対してfor文で次の処理を行う
ファイル名は「少女絶景紀行#83_暮れなずむ丘陵 - Sunset Shadows on the Hills.png」のような形式で、ここなら83の番号をnum、暮れなずむ丘陵 - Sunset Shadows on the Hillsをtitleとして読み取る
次に下記のテンプレートにnumとtitleを代入する
```
◀︎Follow me!!
<title>
#少女絶景紀行 No.<num>
#Girls_Scenic_Journey
#aiart #aiillustration #aiイラスト #illustgram#イラストグラム #aiartworks #AI美女
```
それをプリントします。 この動作をするpythonスクリプトを書いて。
ChatGPTの回答1
Pythonを使用して、指定されたフォルダ内のファイル名を解析し、それに基づいて特定のテンプレートを生成するスクリプトを以下に示します。これは、Pythonの組み込みモジュールosを使用して、指定されたディレクトリ内の全てのファイル名を取得し、その後、文字列操作を使用して各ファイル名を所望の形式にパースします。
import os
# 対象のディレクトリパスを指定します。
directory_path = "/path/to/your/directory"
# 指定されたディレクトリ内のすべてのファイルを読み取ります。
for filename in os.listdir(directory_path):
# ファイル名が指定した形式に一致するかどうかを確認します。
if filename.startswith("少女絶景紀行#") and filename.endswith(".png"):
# ファイル名から番号とタイトルを抽出します。
num, title = filename[len("少女絶景紀行#"):].split("_", 1)
title = title.rsplit(".", 1)[0]
# テンプレートに番号とタイトルを挿入します。
template = f"""
◀︎Follow me!!
{title}
#少女絶景紀行 No.{num}
#Girls_Scenic_Journey
#aiart #aiillustration #aiイラスト #illustgram#イラストグラム #aiartworks #AI美女
"""
# 生成されたテンプレートをプリントします。
print(template)
このスクリプトは、指定されたディレクトリ内のすべてのファイルを順に処理し、それぞれのファイル名が所望の形式に一致する場合に限り、テンプレートを生成してプリントします。そのため、'少女絶景紀行#'で始まり、'.png'で終わるファイルだけが対象となります。
ディレクトリパスを指定するところは、自身の環境に合わせて変更してください。
回答1の所感
入力パスをコード中に書くのは面倒なので、呼び出しコマンドの引数で指定したい
「少女絶景紀行#」もあれば「風光名明媚着物#」もあるから両方処理できるようにしないと
そういえば、ファイル名の末尾が「*.png」じゃないのもあったと思い出す
少女絶景紀行#13_絶壁から見る海の展望 - Awe-inspiring vista of the sea from a sheer cliff
少女絶景紀行#14_雲間に佇む - Lingering among the Clouds.png
指示2「実行形式とファイル名の例外対応を修正」
呼び出し形式は、python test.py input_path にしてください。
ファイル名は「任意の文字列#」の場合もあることを考慮して#の後ろの数字をnumとしてパースする
ファイル名は「*_title.png」と「*_title」の2パターンがあることを考慮してtitleをパースする
ChatGPTの回答2
了解しました。引数から入力パスを受け取り、さまざまなファイル名の形式を考慮するための更新を行いました。これらの要件に合わせて以下のようにスクリプトを更新しました:
import os
import sys
import re
# コマンドライン引数からディレクトリパスを取得します。
directory_path = sys.argv[1]
# 指定されたディレクトリ内のすべてのファイルを読み取ります。
filenames = sorted(os.listdir(directory_path))
for filename in filenames:
# ファイル名から番号を抽出する正規表現パターンを作成します。
num_pattern = re.compile(r"#(\d+)_")
num_match = num_pattern.search(filename)
if num_match is not None:
num = num_match.group(1)
# ファイル名からタイトルを抽出します。'_'と'.png'またはファイル名末尾の間の部分を取得します。
title = filename.split("_", 1)[1].rsplit(".", 1)[0]
# テンプレートに番号とタイトルを挿入します。
template = f"""
◀︎Follow me!!
{title}
#少女絶景紀行 No.{num}
#Girls_Scenic_Journey
#aiart #aiillustration #aiイラスト #illustgram#イラストグラム #aiartworks #AI美女
"""
# 生成されたテンプレートをプリントします。
print(template)
このスクリプトは python test.py input_path の形式で呼び出すことができ、指定されたディレクトリ内のすべてのファイルに対して処理を行います。ここで、'input_path'は対象のディレクトリのパスです。また、ファイル名は「任意の文字列#数字_title.png」または「任意の文字列#数字_title」の形式となるよう考慮しています。
回答2の所感
いい感じっぽいので実行してみよう。
回答2の実行結果
![](https://assets.st-note.com/img/1689258406906-jtbKSLBPtM.png?width=800)
うーん…ソートはしているけどNo.10から始まってる
これは直したい
指示3「ファイルのソート順を修正」
filenameをソートするときは#1~#9その次に#10~が来るようにしてください。
ChatGPTの回答
了解しました。自然にソートするためには、自分でソート関数を定義する必要があります。以下のスクリプトでは、正規表現を使用して番号を抽出し、その番号に基づいてソートしています。
import os
import sys
import re
# コマンドライン引数からディレクトリパスを取得します。
directory_path = sys.argv[1]
# 指定されたディレクトリ内のすべてのファイルを読み取ります。
filenames = os.listdir(directory_path)
# ファイル名から番号を抽出する正規表現パターンを作成します。
num_pattern = re.compile(r"#(\d+)_")
# ファイル名のリストを自然な順序にソートします。
filenames.sort(key=lambda filename: int(num_pattern.search(filename).group(1)) if num_pattern.search(filename) else float('inf'))
for filename in filenames:
num_match = num_pattern.search(filename)
if num_match is not None:
num = num_match.group(1)
# ファイル名からタイトルを抽出します。'_'と'.png'またはファイル名末尾の間の部分を取得します。
title = filename.split("_", 1)[1].rsplit(".", 1)[0]
# テンプレートに番号とタイトルを挿入します。
template = f"""
◀︎Follow me!!
{title}
#少女絶景紀行 No.{num}
#Girls_Scenic_Journey
#aiart #aiillustration #aiイラスト #illustgram#イラストグラム #aiartworks #AI美女
"""
# 生成されたテンプレートをプリントします。
print(template)
このスクリプトでは、filenames.sort()のkey引数にラムダ関数を指定しています。この関数は、各ファイル名から番号を抽出し、その番号に基づいてソートを行います。num_pattern.search(filename)がNoneを返す(つまり、ファイル名に番号が含まれていない)場合は、float('inf')(無限大)を返し、これにより該当しないファイルはソートの最後に来るようにします。
回答3の所感
対応してくれてるっっぽいので試してみよう
回答の方のは何か気を利かせてくれてるけど気にしなくてもよさそう
回答3の実行結果
![](https://assets.st-note.com/img/1689259022720-olJykMna7R.png?width=800)
いい感じにテキストが出ました!
これで良さそうですね。
他にプリントではなくテキストファイルに保存するようにしたり、文字の前に空白が入っていたりしたので削除してもらいました。
詳細なやり取りはこちらのリンクを見てください。
最後に
どうでしたでしょうか?
1ファイルずつポチポチしていると数百枚の画像を処理するのに数時間は使ったかもしれませんが、ChatGPTくんと連携すればわずか10分程度で終わっています。
私はプログラミングの経験が多少あるので指示文の精度が高いですが、初心者の人でもChatGPTと対話する根気さえあれば色々な処理をプログラミングで自動化できるようになれます。
皆さんの参考になれば幸いです。
この記事が気に入ったらサポートをしてみませんか?