青空文庫からダウンロードしてきた大量のデータから欲しいファイルだけを取り出したいので、ChatGPTに指定した条件にマッチするファイル一覧を取得するコードを書いてもらいました。
ls、tree、find、grepコマンド等と正規表現の組み合わせとかでも同じことが出来そうですが、今回は作業場であるjupyter上で処理したいのでPythonで。
指示文(プロンプト):
以下の条件にあうPythonプログラムを書いてください
ディレクトリ /**** 以下を再帰的に探索して、全てのファイルの名称とパスを取得し、リストに格納する。
次に取得したリストに、以下に指定した条件を実行する。
・ 拡張子が zip の場合、リストから除外する
・ 拡張子が ebk の場合、リストから除外する
・ ファイル名に card が含まれる場合、リストから除外する
最後にリストの内容を list.txtというテキストファイルにして保存してください。
回答:
import os
# ディレクトリを再帰的に探索して、ファイルの名称とパスを取得し、リストに格納する関数
def get_file_list(dir_path):
file_list = []
for dirpath, dirnames, filenames in os.walk(dir_path):
for filename in filenames:
file_path = os.path.join(dirpath, filename)
file_list.append(file_path)
return file_list
# 拡張子が指定された値であるかを判定する関数
def has_extension(file_path, extension):
return file_path.lower().endswith(extension.lower())
# ファイル名に指定された文字列を含むかを判定する関数
def has_string_in_filename(file_path, string):
return string.lower() in os.path.basename(file_path).lower()
# ディレクトリを指定
dir_path = "/********"
# ディレクトリを再帰的に探索して、ファイルの名称とパスを取得し、リストに格納
file_list = get_file_list(dir_path)
# 条件に合ったファイルをリストから除外
file_list = [file_path for file_path in file_list if not has_extension(file_path, ".zip")]
file_list = [file_path for file_path in file_list if not has_extension(file_path, ".ebk")]
file_list = [file_path for file_path in file_list if not has_string_in_filename(file_path, "card")]
# リストの内容を list.txt に保存
with open("list.txt", "w") as f:
for file_path in file_list:
f.write(file_path + "\n")
このプログラムは、指定されたディレクトリを再帰的に探索し、全てのファイルの名称とパスを取得して、リストに格納します。その後、拡張子が .zip や .ebk であるファイル、およびファイル名に card を含むファイルをリストから除外します。最後に、リストの内容を list.txt というテキストファイルに保存します。
結果:
無事に欲しかったhtmlファイルのリストだけが取得できました。ディレクトリは実際にデータが格納されているパスを指定しています。
除外する条件も追加しやすいコードなので、jpegとかpngが混ざっていた場合は、都度、追加すればよいですね。
もしくは「拡張子htmlだけを取り出す」という指示でもよかったかもしれませんが。。。