Pythonの辞書機能を使って, Live2Dの専用ソフトウェアに読み込ませることが出来るモデルファイルのJSONを作ろうと考えています.
具体的なコード, 実装したいこと
モデルファイルのサンプルをこちらに貼付します.
JSON
1#model.json 2 3{ 4 "model":"XXX.moc", 5 "textures":[ 6 "XXX.png" 7 ], 8 "motions":{ 9 "idle":[ 10 {"file":"../motion/angry01.mtn"} 11 {"file":"../motion/angry02.mtn"}, 12 {"file":"../motion/bye01.mtn"}, 13 {"file":"../motion/cry01.mtn"}, 14 {"file":"../motion/idle01.mtn"}, 15 {"file":"../motion/idle02.mtn"}, 16 {"file":"../motion/kime01.mtn"}, 17 {"file":"../motion/nf01.mtn"}, 18 {"file":"../motion/nf02.mtn"}, 19 {"file":"../motion/nf03.mtn"}, 20 {"file":"../motion/nf04.mtn"}, 21 {"file":"../motion/nf05.mtn"}, 22 {"file":"../motion/nf_left01.mtn"}, 23 {"file":"../motion/nf_right01.mtn"}, 24 {"file":"../motion/pui01.mtn"}, 25 {"file":"../motion/sad01.mtn"}, 26 {"file":"../motion/serious01.mtn"}, 27 {"file":"../motion/shame01.mtn"}, 28 {"file":"../motion/smile01.mtn"}, 29 {"file":"../motion/smile02.mtn"}, 30 {"file":"../motion/smile03.mtn"}, 31 {"file":"../motion/sneeze01.mtn"}, 32 {"file":"../motion/surprised01.mtn"} 33 ] 34 } 35}
"motions":{
"idle":[
以下はPythonの辞書的な説明をするなら"file"がキー, "../motion/XXXXX.mtn"がバリューに相当します.
現在, 特定フォルダに格納されているファイルをスキャンし, そのファイルの情報をmodel.json にまとめる, というプログラムを作成しています.
ですが, "motions"以下のグループを書き出す際, Pythonの辞書配列では同階層に同じキーは存在することが出来ないため, 要素編集や辞書連結等を使って順々にキーを書き足していくことができず, 質問に参りました.
※※※ちなみに, この"file"のキーの名前は変更すると専用ソフトで認識できなくなるため, 別のキーの名前にするということはできません.
求めている解答
このようなJSONファイルをPythonで作る場合, 辞書以外に有効な方法はありますでしょうか? もしくはできればPythonで解決したいですが他に楽, 現実的に解決できそうな方法等ございますでしょうか?
###追記
実際に使用しているコードはこちらです
※フォルダ構成は
Live2D
┣ sample(必要なファイルはすべてこの中)
となっています.
Python
1import os 2import glob 3import json 4 5os.chdir(os.path.dirname(os.path.abspath(__file__))) 6files = os.listdir("./live2D") 7files_dir = [f for f in files if os.path.isdir(os.path.join("./live2D", f))] 8 9for dir in files_dir : 10 dic = {"name":"Live2D","model":"moc/Live2D.moc","textures":["Texture2D/texture_00.png"],"motions":{"idle":[{"name":0,"file":0}],"tap":[{"name":0,"file":0}]},"expressions":[{"name":0,"file":0}],"physics":"physics/physics.json","lip_sync":"true"} 11 12 mocfiles = glob.glob('./live2D/'+str(dir)+'/**/*.moc') 13 dic["model"] = str(mocfiles)[len(dir)+13:-2].replace('\','/') 14 phyfiles = glob.glob('./live2D/'+str(dir)+'/**/*physics.json') 15 dic["physics"] = str(phyfiles)[len(dir)+13:-2].replace('\','/') 16 17 mtnfiles = glob.glob('./live2D/'+str(dir)+'/**/*.mtn') 18 exdic = {"idle":[{"name":0,"file":0}],"tap":[{"name":0,"file":0}]} 19 20 for mtn in mtnfiles: 21 exdic.update({"file":str(mtn)[len(dir)+10:].replace('\','/')}) 22 dic ["motions"].update(exdic) 23 24 with open (r"./Live2D/"+dir+"/model.json","w") as f: 25 f.write(json.dumps(dic, ensure_ascii=False, indent=4, sort_keys=False, separators=(',', ': '))) 26 print(json.dumps(dic, ensure_ascii=False, indent=4, sort_keys=False, separators=(',', ': '))) 27
実行結果
{ "name": "Live2D", "model": "moc/Live2D.moc", "textures": [ "Texture2D/texture_00.png" ], "motions": { "idle": [ { "name": 0, "file": 0 } ], "tap": [ { "name": 0, "file": 0 } ], "file": "motion/rokka_surprised02.mtn" }, "expressions": [ { "name": 0, "file": 0 } ], "physics": "physics/physics.json", "lip_sync": "true" }
このように"file": "motion/rokka_surprised02.mtn"しか出力されません. (これは名前順で最後のファイル)
回答3件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
退会済みユーザー
2020/03/03 08:04
2020/03/03 08:44