強火で進め

このブログではプログラム関連の記事を中心に書いてます。

PythonでZipファイルを一括解凍する

ちょっとZipファイルをたくさん落としたときに個別に解凍するのがめんどくさかったので作成。
Mac版も作ろうかと思ったけどパス名関連の文字コードUTF-8にすれば良いかと思ったけどそれだけだと上手く行きませんでしたorz ※解決したらそのうちアップします。

今回、作ったプログラムはPythonのファイルとバッチファイルを組み合わせたものです。

(2009/02/05 追記)

ocean-city さんからコメント欄にて
最新のPython 2.6.1ではドロップを受け入れることを教わりました。

そのため直接、Pythonにドロップ可能な2.6.1ではバッチファイルの
作成は必要ありません。

とりあえずPythonを実行したディレクトリ内のZipファイルを一括解凍できれば良いかとも思ったんですがそれだけだと使い勝手が悪いのでディレクトリをドラッグしすればそのディレクトリ内のZipファイルを解凍する様に作成しました。

ここの処理がPythonだとできないので(※)バッチファイルを使っています。
※色々とライブラリを使えばできないことはないんですが今回は簡単に実装するためバッチです(^_^;)

バッチファイルの内容は以下の様になります。

cd /d %~dp0
all_unzip.py %1
pause

この内容をエディタで作成し、ファイル名を run.bat で保存します。

次にPythonプログラムです。こちらは以下の様に記述し、バッチファイルと同じ位置に保存します。

文字コードUTF-8
ファイル名:all_unzip.py

# -*- coding: utf-8 -*-

import zipfile
import os
import sys
import codecs
import glob

sys.stdout = codecs.getwriter('cp932')(sys.stdout)

if (len(sys.argv) >= 2):
	targetdir = sys.argv[1]
	if not os.path.isdir(targetdir):
		print u' %s は存在しないディレクトリです' % (targetdir)
		quit()
else:
	targetdir = os.getcwd()
searchpath = os.path.join(targetdir, '*.zip')
print 'searchpath:'+searchpath.decode("cp932")
for zippath in glob.glob(searchpath):
	print 'zip:'+os.path.basename(zippath).decode("cp932")
	try:
		zf = zipfile.ZipFile(zippath, 'r')
		for path in zf.namelist():
			fullpath = os.path.join(targetdir, path)
			dec_fullpath = fullpath.decode("cp932")
			dec_dir,dec_file = os.path.split(dec_fullpath)
#			print 'path:'+dec_fullpath
#			print 'file:'+dec_file
#			print 'dir:'+dec_dir
			if os.path.basename(dec_file):
				if not os.path.isdir(dec_dir):
					os.mkdir(dec_dir)
				uzf = file(dec_fullpath, 'wb')		# 出力先はZipファイルでの指定位置
				uzf.write(zf.read(path))
				uzf.close()
		zf.close();
		os.remove(zippath)
	except:
		print u'***解凍時にエラー発生(%s)' % (zippath.decode("cp932"))

これでバッチファイル(run.bat)を実行すると同じディレクトリに有るZipファイルを解凍し、バッチファイルにディレクトリをドラッグした場合はそのディレクトリ内のZipが解凍されます。

まあ、わざわざ自前で作らなくても探せばば同じ様なことができるアプリとかありそうですけど、こちらの方がやられているようにOS Xで作ったZipファイルを解凍する様に加工するなどPythonならではの柔軟性があるかなぁ?と思います。

OSXで作ったzipをWinで解凍するさらにもう一つの方法 (Python) - 路傍のプログラマ
http://blog.goo.ne.jp/anoydevl/e/aacc643cc234c2456b4c5d84b2abd8c2