プロが教える店舗&オフィスのセキュリティ対策術

こんにちは。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>

#ここで投稿すると、インデントがなくなってしまうようです。

A 回答 (2件)

すみません。

ちょっと開きました。

#1の補足にあったスクリプトで試してみましたが、
補足にあるようなエラーにはなりませんでした。
圧縮されたバイナリが画面に出てきて、ぐちゃぐちゃに。

とはいえ#1でわたしがつけたスクリプトですが、
____gzfile.colse()
これは
____gzfile.close()
の間違いでした。
でもこれだけでは補足にあるメッセージにはならないんですよねえ。
もうちょっと調べさせてください。
    • good
    • 0

あ、二つあったんですか。


こっちは見落としてた。

えと、
#! /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

補足日時:2009/02/22 16:39
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!