Pythonツール ドラッグアンドドロップ(単一ファイル)

Pythonで4択クイズゲーム用CSVファイルをJSONファイルに変換する方法

概要

Pythonを使用してCSVファイルをJSONファイルに変換する作業は、多くのデータ処理やWeb開発において重要です。この記事では、TkinterとTkinterDnD2ライブラリを使って、CSVファイルを簡単にドラッグアンドドロップでJSONファイルに変換するツールの作成方法を紹介します。このツールを使うことで、手間のかかるデータ変換作業を効率化できます。

今回のツールは下記の記事の「アニメを題材にした4択クイズゲーム」で使用するjsonファイルを作成するのに最適です。

使用例

例えば、以下のような内容のCSVファイルをJSONファイルに変換する場合を考えます。

CSVファイル内容:

No,story,time,question,correct,wrong1,wrong2,wrong3
1,1,0:53,闘いで多くのクランが滅び、残ったクランでないものは次のうちどれ,加賀,甲賀,伊賀,雑賀
2,1,1:31,咲耶の携帯の色に近いものはどれ,緑,紫,赤,青
3,1,2:36,ネムが刀を素振りしたらどうなった,身体から血が吹き出た,コンビニが真っ二つになった,何も起きなかった,刀が折れた

これを次のようなJSON形式に変換します。

[
{"No": 1, "story": 1, "time": "0:53", "question": "闘いで多くのクランが滅び、残ったクランでないものは次のうちどれ", "correct": "加賀", "wrong1": "甲賀", "wrong2": "伊賀", "wrong3": "雑賀"},
{"No": 2, "story": 1, "time": "1:31", "question": "咲耶の携帯の色に近いものはどれ", "correct": "緑", "wrong1": "紫", "wrong2": "赤", "wrong3": "青"},
{"No": 3, "story": 1, "time": "2:36", "question": "ネムが刀を素振りしたらどうなった", "correct": "身体から血が吹き出た", "wrong1": "コンビニが真っ二つになった", "wrong2": "何も起きなかった", "wrong3": "刀が折れた"}
]

必要なPythonライブラリとインストール方法

このツールを使用するためには、以下のPythonライブラリが必要です。

  • tkinter
  • tkinterdnd2
  • pandas

以下のコマンドを使用して必要なライブラリをインストールします。

pip install tkinterdnd2 pandas

使用手順

  1. 必要なパッケージをインストール:shコードをコピーするpip install tkinterdnd2 pandas
  2. プログラムコードをコピーして、メモ帳などのテキストエディタに貼り付けます。
  3. ファイル名を csv_to_json_converter.py として保存します。
  4. コマンドラインまたはターミナルを開き、ファイルを保存したディレクトリに移動します。
  5. 次のコマンドを実行してスクリプトを起動します。shコードをコピーするpython csv_to_json_converter.py
  6. 開いたウィンドウにCSVファイルをドラッグアンドドロップするか、クリックしてファイルを選択します。
  7. JSONファイルが自動的に生成され、同じディレクトリに保存されます。

注意点

  • ファイルパス: ファイルパスに日本語や特殊文字が含まれている場合、正常に動作しないことがあります。その場合は、ファイルパスを英数字のみに変更してください。
  • CSVファイルの形式: CSVファイルの形式が正しくない場合、エラーが発生することがあります。事前にCSVファイルの形式を確認してください。

プログラム

下記のコードをメモ帳などに丸々コピーしてpythonファイル(csv_to_json_converter.py)にしてください。

import tkinter as tk
from tkinterdnd2 import TkinterDnD, DND_FILES
from tkinter import filedialog, messagebox
import pandas as pd
import json

def convert_csv_to_json(csv_file_path):
try:
# CSVファイルを読み込む
df = pd.read_csv(csv_file_path)

# データフレームを辞書のリストに変換
questions_list = df.to_dict(orient='records')

# JSONファイルとして保存
json_file_path = csv_file_path.replace('.csv', '.json')
with open(json_file_path, 'w', encoding='utf-8') as json_file:
json.dump(questions_list, json_file, ensure_ascii=False, indent=4)

messagebox.showinfo("成功", f"JSONファイルが作成されました:\n{json_file_path}")
except Exception as e:
messagebox.showerror("エラー", str(e))

def on_drop(event):
csv_file_path = event.data
csv_file_path = csv_file_path.strip('{}') # Windowsのファイルパスから{}を削除
convert_csv_to_json(csv_file_path)

def select_file():
file_path = filedialog.askopenfilename(filetypes=[("CSVファイル", "*.csv")])
if file_path:
convert_csv_to_json(file_path)

# メインウィンドウを作成
root = TkinterDnD.Tk()
root.title("CSVからJSONへの変換ツール")

# ドロップエリアのフレームを作成
drop_frame = tk.Frame(root, width=400, height=200, bg="lightgrey")
drop_frame.pack(padx=10, pady=10)

# ドロップエリアにラベルを作成
label = tk.Label(drop_frame, text="ここにCSVファイルをドラッグ&ドロップ\nまたはクリックしてファイルを選択", bg="lightgrey")
label.pack(expand=True)

# ドロップイベントをバインド
drop_frame.drop_target_register(DND_FILES)
drop_frame.dnd_bind('<<Drop>>', on_drop)

# クリックイベントをファイルダイアログを開くようにバインド
drop_frame.bind("<Button-1>", lambda event: select_file())

# メインイベントループを開始
root.mainloop()

あるいは、下のテキストファイルをダウンロードし、「.txt」を「.py」に変えることでそのまま使えます。

まとめ

この記事では、PythonとTkinterを使用してCSVファイルをJSONファイルにドラッグアンドドロップで変換する方法を紹介しました。このツールを使用することで、データ変換の作業が簡単かつ迅速に行えるようになります。Pythonの強力なライブラリを活用し、作業効率を向上させましょう。

-Pythonツール, ドラッグアンドドロップ(単一ファイル)