Pythonでzipファイルを解凍せずに中身のテキストファイルを読み込む
10万件程度のテストデータが欲しい時、よく郵便番号のデータを使わせてもらっています。郵便番号データダウンロード
http://www.post.japanpost.jp/zipcode/dl/kogaki.html
今までlzh形式で圧縮されたデータしか公開されていないと思っていたのですが、
よくみるとzip形式のデータも公開されています。
zip圧縮されたファイルは約1.8MB。
解凍すると12.2MB。
zip圧縮したファイルを直接読み込んで、直接郵便番号と住所の情報を
加工できないか考えてみました。
Pythonでzipファイル
以前、zipファイルの作成は試したことがあります。
Pythonでrarファイルを解凍し、zipで圧縮する
http://symfoware.blog68.fc2.com/blog-entry-908.html
同じノリで、zipファイルの情報を取り出してみます。
- # -*- coding:utf-8 -*-
- import zipfile
- with zipfile.ZipFile('ken_all.zip', 'r') as post:
- # zipファイルを開いて、中に格納されいるファイル名を表示
- for info in post.infolist():
- print(info.filename)
実行してみると、中に格納されているファイル「KEN_ALL.CSV」の
名前が表示されました。
KEN_ALL.CSVを読み込む
ファイルの内容を取り出すには、readすれば良さそうだったので、
うっかりこんなプログラムを書いて実行してしまいました。
※12万件の郵便番号データがコンソールに表示され、えらいことになります。
- # -*- coding:utf-8 -*-
- import zipfile
- with zipfile.ZipFile('ken_all.zip', 'r') as post:
- # zipファイルを開いて、中に格納されいるファイル名を表示
- for info in post.infolist():
- print(info.filename)
- # KEN_ALL.CSVの内容を取得
- print( post.read('KEN_ALL.CSV') )
これでは使いやすいように加工できないので、一行ずつ
データを取り出す方法を考えてみました。
StringIOを使ってやります。
- # -*- coding:utf-8 -*-
- import zipfile
- import cStringIO
- with zipfile.ZipFile('ken_all.zip', 'r') as post:
- # zipファイルを開いて、中に格納されいるファイル名を表示
- for info in post.infolist():
- print(info.filename)
- # KEN_ALL.CSVの内容を取得し、StringIOでくるむ
- f = cStringIO.StringIO(post.read('KEN_ALL.CSV'))
- for line in f:
- print( line )
- #デバッグ用に一行表示したらループを抜ける
- break
文字化けしていますが、1行分のデータを取り出せています。
後もう一息、CSVファイルはms932で保存されているので、unicodeに変換。
- # -*- coding:utf-8 -*-
- import zipfile
- import cStringIO
- with zipfile.ZipFile('ken_all.zip', 'r') as post:
- # zipファイルを開いて、中に格納されいるファイル名を表示
- for info in post.infolist():
- print(info.filename)
- # KEN_ALL.CSVの内容を取得し、StringIOでくるむ
- f = cStringIO.StringIO(post.read('KEN_ALL.CSV'))
- for line in f:
- # ms932からunicodeオブジェクトに変換
- print(unicode(line, 'ms932'))
- #デバッグ用に一行表示したらループを抜ける
- break
これで、ダウンロードしたファイルを一旦解凍せずに、
郵便番号と住所のテストデータが加工できそうです。
【参考URL】
13.5. zipfile — ZIP アーカイブの処理
http://www.python.jp/doc/release/library/zipfile.html
7.5. StringIO — ファイルのように文字列を読み書きする
http://www.python.jp/doc/release/library/stringio.html
- 関連記事
-
- hgコマンドでBitbucketにプッシュする
- Debianにtrac 1.0 (日本語化済み)をインストールする
- Pythonでzipファイルを解凍せずに中身のテキストファイルを読み込む
- pysmbを使用し、Debian + pythonからWindows共有フォルダにアクセスする
- Pythonでrarファイルを解凍し、zipで圧縮する
コメント