mieki256's diary



2021/12/07(火) [n年前の日記]

#1 [python] Pythonでzipからファイルを取り出したい

Pythonを使って、zipファイルから任意のxmlファイルを取り出して処理をさせたい。

環境は、Windows10 x64 21H1 + Python 3.9.7 x64。

ググってみたところ、Python で zipファイルを扱うなら、zipfile というモジュールが使えるらしい。また、xml を扱うなら、xml.etree.ElementTree というモジュールを使えばいいらしい。

ということで、あちこちの解説記事からコピペして、以下のような感じになった。python 01_getziplist.py hoge.zip といった指定で動く。

_01_getziplist.py
import zipfile
import sys
import xml.etree.ElementTree as ET 

target = "manifest.xml"

# get input file name
if len(sys.argv) < 2:
    print("Usage: python ThisScript.py INFILE")
    sys.exit()
    
infile = sys.argv[1]
print("Input File : %s\n" % infile)

# Open zip
zipf = zipfile.ZipFile(infile)

# Get filenames
if True:
    # use .namelist()
    names = zipf.namelist()
else:
    # use .infolist()
    names = []
    for info in zipf.infolist():
        names.append(info.filename)

# print filenames
for fn in names:
    print(fn)
print()

if target in names:
    print("Found %s\n" % target)
else:
    print("Not found %s\n" % target)
    sys.exit()

# Read target file 
xmldata = zipf.read(target)
# print(xmldata)

# Parse xml
root = ET.fromstring(xmldata)

print("---- %s" % target)
ET.dump(root)
print()

for i in root.iter():
    print(i.tag, i.attrib, i.text)
print()

# get game tag
elem = root.find("game")
if elem is None:
    print("Not found <game> tag")
else:
    # get game tag text
    kind = elem.text
    
    if kind is None:
        print("<game></game>")
    elif kind == "":
        print("<game></game>")
    else:
        print("<game>%s</game>" % kind)

出力結果は以下。
> python 01_getziplist.py hogezip.zipmod
Input File : hogezip.zipmod

abdata/chara/
abdata/chara/hoge.unity3d
abdata/chara/thumb/
abdata/chara/thumb/hoge_thumb.unity3d
abdata/list/
abdata/list/characustom/
abdata/list/characustom/00/
abdata/list/characustom/00/hoge_list_ao_head_00.csv
manifest.xml

Found manifest.xml

---- manifest.xml
<manifest schema-ver="1">
        <guid>com.fuga.hoge</guid>
        <name>hogemod</name>
        <version>1.0.0</version>
        <author>fuga</author>
        <description>description</description>
        <website>https://example.com</website>
        <game>AI Girl</game>
</manifest>

manifest {'schema-ver': '1'}

guid {} com.fuga.hoge
name {} hogemod
version {} 1.0.0
author {} fuga
description {} description
website {} https://example.com
game {} AI Girl

<game>AI Girl</game>

これで、Pythonを使えば以下の処理ができることが分かった。

動機。 :

何故こんな処理をやりたいかというと…。某3Dゲームのmodファイルが、どのタイトル向けのmodなのかを知りたいなと。

某3Dゲームのmodは、拡張子が .zipmod で統一されているのだけど、実態は只のzipファイル。そのzipの中に、決まったファイル名でxmlファイルが1つ入っていて、そのxmlに、どのタイトル向けのmodなのか記述されていて…。某3Dゲームでそのmodを読み込んだ際、タイトルが一致すれば利用可、一致しなければ利用不可になるけれど、modを入手してインストールしたのに反映されなくて悩んだら別タイトル向けの指定がされていた、といった場面がたまにあって。

今までは、そのあたりを確認する際、以下の作業をしていたのだけど。
  1. ファイラー(あふ)で .zipmod を .zip にリネーム。
  2. ファイラーで .zip の中を覗く。
  3. xmlファイルがあることを確認して、内容を閲覧表示。
  4. タグ内容を把握。
  5. 問題がなければ .zip を .zipmod にリネームし直す。

しかし、この確認作業が地味に面倒臭い。そこで、.zipmod のファイルパスを渡したら、中からxmlを読み込んで特定のタグ情報だけ出力して終わる、という処理をスクリプトで書けたら、少しだけ楽にならないかと思った次第。

できれば、xml内の記述タイトルが違ってたら、zipを展開して、xmlファイルを書き換えて、またzipに圧縮して、.zipmod にリネーム、という処理までさせたいけれど…。そのあたりは今後の課題。

以上です。

過去ログ表示

Prev - 2021/12 - Next
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31

カテゴリで表示

検索機能は Namazu for hns で提供されています。(詳細指定/ヘルプ


注意: 現在使用の日記自動生成システムは Version 2.19.6 です。
公開されている日記自動生成システムは Version 2.19.5 です。

Powered by hns-2.19.6, HyperNikkiSystem Project