こんにちは、拓です。

開発したクイズアプリのデータセットに今まではcsvファイルを使ってたんですけど、デプロイするときにcsvだと設定が面倒なので、データセットをpythonファイルへ変換する作業をしていました。

無事完了してpythonファイルのデータセットを作ることができたんですが、変換の手法を丸々生成AIのGithub Copilotに投げて実行していて、これが結構興味深かったのでまとめてみようと思います。ここでの作業を整理しておくと、csvからpythonへの変換に限らずいろんな種類のファイル変換作業をするときに何かしら役立つんじゃないかと思うので。

では早速いきましょう。

image.jpg

毒をもって毒を制するように、pythonをもってpythonを制する

csvのデータセットファイルをpythonファイルへの変換にどんな手法を使ったのかというと、

変換用のpythonファイルを作成し実行することでcsv→pythonへのファイル変換を実現しました。

pythonファイルへの変換を行うために変換専用のpythonファイルを使ったということですね。

図で表すと、

<aside>

変換元のcsvファイル→変換用のpythonファイル→変換先のpythonファイル

</aside>

といった感じです。

「毒をもって毒を制する」という言葉があるように、今回は「pythonでもってpythonを制する」というやり方でファイル変換を行いました。

実際の変換用のpythonスクリプトは以下の通り。

# ファイル名:convert_csv_to_py.py

import csv
import os

# CSVファイルのパス
csv_file_path = 'py/dataset.csv'
# 出力するPythonファイルのパス
py_file_path = 'py/dataset.py'

# CSVファイルを読み込み、辞書リストに変換
questions = []
with open(csv_file_path, 'r', encoding='utf-8') as csvfile:
    reader = csv.DictReader(csvfile)
    for row in reader:
        choices = [
            {'id': i+1, 'text': row[f'choice{i+1}']} for i in range(4)
        ]
        correct_choice_id = next((i + 1 for i, choice in enumerate(choices) if choice['text'] == row['correct_choice']), None)
        explanation = row['explanation'].replace('"', '').replace('|','<br>')
        questions.append({
            'id': int(row['id']),
            'text': row['question'],
            'image': row['image'],
            'choices': choices,
            'correct_choice_id': correct_choice_id,
            'explanation': explanation,
            'category': row['category']
        })

# Pythonファイルとして保存
with open(py_file_path, 'w', encoding='utf-8') as pyfile:
    pyfile.write(f"questions = {questions}")

この手法の面白い点は、**「pythonへの変換には同じpythonが使える」**ということ。

変換作業をやると決めたとき、予想としてはコンソール上のコマンド実行や別の言語を使わないといけないのかもしれないと考えていました。

でもGithub Copilotにやり方を尋ねてみると、**「データセットのcsvファイルをpythonに変換したいの?それ、同じpythonでできるよ」**ということだったわけです。