- 締切済み
Pythonプログラムのエラー
こんにちは。pythonプログラムを勉強しはじめたばかりのものです。 次のプログラムが最後の行の#のところでエラーになってなかなか 解決ができません。アドバイスいただけませんでしょうか。 #! /python30/python # coding:shift_jis import sys, os, urllib, gzip def GetAndGzip(url, out): ''' urlを読み込み、gzipで圧縮してファイルoutに出力 ''' remote = urllib.urlopen(url).read() gzfile = gzip.GzipFile(filename='', mode='web', fileobj=out) gzfile.write(remote) gzfile.colse() #パラメータを抽出 if len(sys.argv) <> 2: print '使い方:python wgetgz.py url' else: url = sys.argv[1] GetAndGzip(url, sys.stdout) #ここでエラーin<module> #ここで投稿すると、インデントがなくなってしまうようです。
- みんなの回答 (2)
- 専門家の回答
みんなの回答
- sakusaker7
- ベストアンサー率62% (800/1280)
すみません。ちょっと開きました。 #1の補足にあったスクリプトで試してみましたが、 補足にあるようなエラーにはなりませんでした。 圧縮されたバイナリが画面に出てきて、ぐちゃぐちゃに。 とはいえ#1でわたしがつけたスクリプトですが、 ____gzfile.colse() これは ____gzfile.close() の間違いでした。 でもこれだけでは補足にあるメッセージにはならないんですよねえ。 もうちょっと調べさせてください。
- sakusaker7
- ベストアンサー率62% (800/1280)
あ、二つあったんですか。 こっちは見落としてた。 えと、 #! /python30/python とあるので、3.0で動かそうとしているのかもしれませんが、 2.xから3.0へのバージョンアップに伴い変わった部分に引っかかっているのがあります。 ひょっとしてもとは2.x用のスクリプトを書き写したとかではないですか? import sys, os, urllib, gzip 3.0 では、urllib ではなく urllib.request を import してください。 そして呼び出し部分にも request を追加してください。 remote = urllib.urlopen(url).read() ↓ remote = urllib.request.urlopen(url).read() 3.0では等しくないという検査をする演算子に<>を使えなくなりました。 if len(sys.argv) <> 2: ↓ if len(sys.argv) != 2: 文字列の扱いが変わったので、標準出力(sys.stdout)に圧縮結果のような バイナリイメージを出力できなくなりました。 GetAndGzip(url, sys.stdout) ↓ GetAndGzip(url, sys.stdout.buffer) 以上の変更を行えばきちんと動くようになると思います。 3.0は大きなバージョンアップが行われたばかりなので、ネットで探しても 3.0では事情が変わってそのまま使えないというものが見つかりやすいと思います。 今3.0でなければならないという理由がなければ、 2.6系列(今の最新は2.6.1?)を使った方が良いと思います。 import sys, os, urllib, gzip import urllib.request def GetAndGzip(url, out): ____''' urlを読み込み、gzipで圧縮してファイルoutに出力 ____''' ____remote = urllib.request.urlopen(url).read() ____#remote = urllib.urlopen(url).read() ____gzfile = gzip.GzipFile(filename='', mode='web', fileobj=out) ____gzfile.write(remote) ____gzfile.colse() #パラメータを抽出 if len(sys.argv) != 2: ____print('使い方:python wgetgz.py url') else: ____url = sys.argv[1] GetAndGzip(url, sys.stdout.buffer) #ここでエラーin<module> 行頭の空白はなくなってしまうので、_で置き換えてます。
補足
ご指摘ありがとうございます。 使っているPYTHONのバージョンが3.0で 勉強しているテキストがバ-ジョン2.6をベースに書かれているようです。 ところで、テキストを次のように変えたのですが、 やはり、同じく最後の行でエラーになります。 すいませんが、アドバイスいただけると有難いです。 #! /python30/python # coding:shift_jis import sys, os, urllib, gzip import urllib.request def GetAndGzip(url, out): ''' urlを読み込み、gzipで圧縮してファイルoutに出力 ''' remote = urllib.request.urlopen(url).read() gzfile = gzip.GzipFile(filename='', mode='web', fileobj=out) gzfile.write(remote) gzfile.colse() #パラメータを抽出 print(len(sys.argv)) if len(sys.argv) != 2: print('使い方:python wgetgz.py url') #print文修正 else: url = sys.argv[1] GetAndGzip(url, sys.stdout.buffer) #ここでエラーin<module> # この後はDOS窓でみたエラーの状況 C:\PythonProg>wgetgz.py http://www.yahoo.com 2 Traceback (most recent call last): File "C:\Python30\lib\urllib\request.py", line 1067, in do_open h.request(req.get_method(), req.get_selector(), req.data, header File "C:\Python30\lib\http\client.py", line 862, in request self._send_request(method, url, body, headers) File "C:\Python30\lib\http\client.py", line 906, in _send_request self.endheaders() File "C:\Python30\lib\http\client.py", line 857, in endheaders self._send_output(message_body) File "C:\Python30\lib\http\client.py", line 715, in _send_output self.send(msg) File "C:\Python30\lib\http\client.py", line 669, in send self.connect() File "C:\Python30\lib\http\client.py", line 653, in connect self.timeout) File "C:\Python30\lib\socket.py", line 292, in create_connection for res in getaddrinfo(host, port, 0, SOCK_STREAM): socket.gaierror: [Errno 11001] getaddrinfo failed During handling of the above exception, another exception occurred: Traceback (most recent call last): File "C:\PythonProg\wgetgz.py", line 21, in <module> GetAndGzip(url, sys.stdout.buffer) #ここでエラーin<module> File "C:\PythonProg\wgetgz.py", line 10, in GetAndGzip remote = urllib.request.urlopen(url).read() File "C:\Python30\lib\urllib\request.py", line 122, in urlopen return _opener.open(url, data, timeout) File "C:\Python30\lib\urllib\request.py", line 358, in open response = self._open(req, data) File "C:\Python30\lib\urllib\request.py", line 376, in _open '_open', req) File "C:\Python30\lib\urllib\request.py", line 336, in _call_chain result = func(*args) File "C:\Python30\lib\urllib\request.py", line 1082, in http_open return self.do_open(http.client.HTTPConnection, req) File "C:\Python30\lib\urllib\request.py", line 1070, in do_open raise URLError(err) urllib.error.URLError: <urlopen error [Errno 11001] getaddrinfo fail