ComicInfoEditor v0.0.1/2

まだ0.0.1にすらなってないけど、一応進捗を。

とりあえず、ComicInfo.xmlを編集する機能ができつつある。
現状、「すでに設定されている要素」を編集することはできるようになった。つまり、'Series'を"foo"から"bar"みたいな変更はできる。また、「要素の削除」もできる。何か文字列が入っているところを""にすればその要素が削除される。
  

新規要素の追加も、不安ではあるが一応できているかな…?という感じ。Comicrackで生成されるComicInfo.xmlは要素の順序が決まっているんだけど、それとは違う順序で追記して大丈夫なのかどうかテストしないといけない。

今回のポイントは、変更したxmlをzip内に書き込む所。
組み込みのElementTree XML APIではWriteというメソッドがあるけれども、これをそのまま使うとカレントディレクトリに出力されてしまいzip内に書き込んでくれない。
まぁ、中級者とかならなんの問題もなく解決できるところだろうけれども初心者の自分はここで結構詰まった。

解決策は、StringIOオブジェクトにComicInfo.xmlの内容を書き込んでZipFileのwritestrメソッドに渡すというもの。

こんな感じでStringIOオブジェクト(戻り値にもなってるg)を作って、

こんな感じでそれをzip内のComicInfo.xmlに書き込む。

で、実はここに大きな問題がある。ZipFileは、アーカイブファイルごと置き換えてしまうか追記するか、しかできないのである。
ファイルを開くときのモードには'w'と'a'があるが、前者でやるとComicInfo.xmlというファイルを持った新しいzipが作られる。つまり、それ以外にあったはずの画像ファイルはすべて消えてしまう。
後者でやると、ComicInfo.xmlに上書きしてくれない。なんと同じファイル名で追記してくれるのである!zip内の同じ場所にComicInfo.xmlがどんどん作られる。(解凍したらどうなるんだろう)
 アーカイブ内のファイルを削除したり、上書きしたりという機能を持っていないため、「上書きしたいファイルだけを含まない新しいアーカイブ」を一時ファイルとして作って 、そこに新しいファイルを追加、最後にアーカイブファイルを上書きという手順を追わないといけないようだ。

残念ながら明日は朝7時台にビッグサイトに行かなくてはいけないし、今日はここまで。