ファイルの実体がzip圧縮されたxmlファイル等であるExcel 2007が登場して以来、定期的にxlsxファイルから画像を取り出す小技が話題となります。
拡張子を「.xlsx」から「.zip」に変更してファイルを解凍すれば、xlフォルダー内のimagesフォルダーに画像ファイルを取り出せるという方法です。
Pythonのzipfileモジュールを使えば、簡単なスクリプトでxlsxファイルから画像だけを取り出すこともできます。
ZipFile.extractでxlsxファイルから画像ファイルを取り出すサンプル
以下のスクリプトを実行すると、Cドライブtempフォルダーのfoo.xlsxファイルの画像ファイルが、同じくCドライブtempフォルダーに作成された、imagesフォルダーに存在するxlフォルダー内のmediaフォルダーに展開されます。
with zipfile.ZipFile('C:\\temp\\foo.xlsx') as zf:
for name in zf.namelist():
if name.startswith('xl/media'):
zf.extract(name, path='C:\\temp\\images')
ZipFile.extractでxlsxファイルから画像ファイルを取り出す処理
ZipFile.namelistメソッドで、zipファイルに含まれるファイルの名前をリストの形で取得できることを記事にしました。
スクリプト全体の構造は、ファイル名を取得する場合と同じです。
with zipfile.ZipFile('C:\\temp\\foo.xlsx') as zf: for name in zf.namelist():
例えば、ワークシート「Sheet1」だけが存在する、新規に作成したブックで、Sheet1に画像が1枚だけ存在する場合にprint(name)すれば、以下のようなファイル名が出力されます。
[Content_Types].xml
_rels/.rels
xl/workbook.xml
xl/_rels/workbook.xml.rels
xl/worksheets/sheet1.xml
xl/theme/theme1.xml
xl/styles.xml
xl/drawings/drawing1.xml
xl/media/image1.png
xl/worksheets/_rels/sheet1.xml.rels
xl/drawings/_rels/drawing1.xml.rels
docProps/core.xml
docProps/app.xml
この「xl/media/image1.png」が、画像ファイルの実体です。
ですから上記のスクリプトでは、取得したxlsxファイルの内部ファイルの名前が「xl/media」で始まっているかをstr.startswithメソッドで判定して、
if name.startswith('xl/media'):
そのファイルをZipFile.extractメソッドでCドライブのtempフォルダー内のimagesフォルダーに展開しています。
zf.extract(name, path='C:\\temp\\images')
最終更新日時:2024-01-16 16:42
Home » Python » xlsxファイルから画像だけをPythonで取り出す-zipfile.extract()関数