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