環境システム株式会社公式HP

〒660-0083 兵庫県尼崎市道意町7-1-3
尼崎リサーチ・インキュベーションセンター512

アイコン06-6657-5130

アイコンsales@hydrolab.co.jp

お問い合わせ

アイコン06-6657-5130

アイコンsales@hydrolab.co.jp

お問い合わせ

蛇使いな彼女BLOG

【第47回】 雑談編⑥ーzipファイルの解凍と読み込み

2021.12.03

こんにちは!前々回はお休みして申し訳ありませんでした。
今回は気を取り直してPythonで圧縮されたzipフォルダーの解凍を行いたいと思います♪

もちろんデスクトップ画面で手動でも行えるのですが…。
以前ちらっとアプリケーションを作っていますと言ったと思いますが、アプリだと解凍前のzipフォルダーを選択すると自動で解析が行えるものはよくありますよね!!
そこで今日はこの解凍部分を紹介しよう思います。

使うzipフォルダーの構造は以下のようになっています。

解凍に使うアイテムはPython標準ライブラリの zipfile です。
実際に作業していて思ったことは、圧縮されていない通常のフォルダーやファイルの操作ではパスを扱いますが、zipはこれとは別物?みたいなので、違いに焦点を置いて説明していこうと思います。

今回私が扱ったzipの中身はhtmlだったので、24行目以降bs4を使って読み込みを行っています。
以前ご紹介した『htmlファイルの読み込みと拡張子の変更を行って保存する』という内容とほぼ同じなので省略させて頂いてます(゚゚)(。。)ペコッ
   
zipfileの公式ページにモジュールの説明はありますが、少しややこしいので、実際のコード例を参照しながら確認していきます。
まず、最初に以下の構文でzipフォルダーのディレクトリパス(フォルダパス)を取得します。

tk.Tk().withdraw()
zip_f=filedialog.askopenfilename(filetypes=[('','*.zip')],initialdir='C://**')


filedialog.askopenfilenameのfiletypesの第一引数にファイルの種類(任意のテキスト)、第二引数に拡張子(*.csv *.txt *.exe)を指定すると、第二引数で指定されたファイルのみがダイアログに表示されます。
また、第一引数で指定した任意のテキストと第二引数の拡張子は、(第一引数+第二引数)の順番でダイアログの右下、【開く】と【キャンセル】ボタンの上部に表示されます。

オプションinitialdirはダイアログに表示する初期ディレクトリを指定します。
次に、
base=os.path.splitext(os.path.basename(zip_f))[0]
この部分はパスの’.zip’以前を取得して、15行目以降でzipを展開したときの状態を確認するために記述しています。
変数baseの中身は'HydroVu_2021-07-24_21-36-00_Export'です。
# zipファイルの中身を取得
with zipfile.ZipFile(zip_f,mode='r') as zip:
for info in zip.infolist():
if (info.filename != base+'/'):
dirpath=os.path.dirname(info.filename)
print(info.filename+'\n'+dirpath)


先ほど取得したzipフォルダーパスをzipfile.ZipFileオブジェクトに放り込み、modeパラメーターを’r’とすることで、圧縮されたzipフォルダーの中身をas zip:で変数「zip」として取得可能にしています。

次に、zip.infolist()で保存されている中身のリストを取得します。
for info in zip.infolist():
この部分でアーカイブから一つ一つのファイル情報を読み込みます。

info.filenameはzipの中に入っているファイルの名前を参照できます。
if (info.filename != base+'/'):と条件を入れていますが、圧縮された状態のzipフォルダー名が、中身のファイル名の前に付いているか付いていないかの確認の為です。

info.filename はあくまでファイル名を取得するので、dirpath=os.path.dirname(info.filename)では、ディレクトリの値が返ってきません。


print(info.filename+'\n'+dirpath)を実行すると以下のようになります。

3行目と5行目はディレクトリの値が入るはずですが、空欄ですよね??
このように通常のパス挙動とは別物として考えてください。

with zip.open(info.filename) as file:
date=file.read()

本文22行目23行目ではzipファイルから中身のテキストを読み込んでいます。
解凍済みのzipフォルダーのファイル名を指定して開いてから、さらにfile.read()でテキストを取得することが出来ます。

どうでしょうか?なんとなく分かって頂けたでしょうか…(;´Д`)
今日はzipフォルダーの解凍のお話でした♪

pagetop