http://www.python.jp/Zope/Zope/intro.1
↑のサイトでサンプルコードを実行したところエラーになったので
一応メモしておく、おそらくPython2.x系向けて書いたコードですが、
Python3.5で動かしたら、下記のエラーが出ちゃいました。
c:\tmp>python wgetgz.py http://www.yahoo.co.jp > wgetlog.gz
Traceback (most recent call last):
File "wgetgz.py", line 14, in <module>
GetAndGzip(url, sys.stdout)
File "wgetgz.py", line 5, in GetAndGzip
gzipfile = gzip.GzipFile(filename='',mode='wb',fileobj=out)
File "C:\Python\Python35\lib\gzip.py", line 192, in __init__
self._write_gzip_header()
File "C:\Python\Python35\lib\gzip.py", line 220, in _write_gzip_header
self.fileobj.write(b'\037\213') # magic header
TypeError: write() argument must be str, not bytes
GzipFileの初期化処理でself.fileobjが文字列を書くつもりだがここでは固定でbyteで書いてるのでNGだったかな、ぐぐったらこんな記事が
http://stackoverflow.com/questions/908331/how-to-write-binary-data-in-stdout-in-python-3
要するsys.stdoutは文字列しか書けないということかな?
そのかわりsys.stdout.bufferを使えばうまく行きます。
#! /usr/bin/env python import sys, os, urllib, gzip def GetAndGzip(url, out): '''GetAndGzip(url, out) urlを読みこみ、gzipで圧縮してファイル out に出力する ''' remote = urllib.urlopen(url).read() gzfile = gzip.GzipFile(filename='', mode='wb', fileobj=out) gzfile.write(remote) gzfile.close() # パラメータを抽出 if len(sys.argv) <> 2: print '使い方: python wgetgz.py url' else: url = sys.argv[1] GetAndGzip(url, sys.stdout) リスト 2: wgetgz.py
% python wgetgz.py http://www.yahoo.com > yahoo.gz