在Python 3.5

时间:2016-07-13 17:48:27

标签: python python-3.x urllib2

我目前正在UDACITY学习机器学习课程。在那里他们已经在python 2.7中编写了一些代码,但由于我目前正在使用python 3.5,我收到了一些错误。这是代码

import urllib
url = "https://www.cs.cmu.edu/~./enron/enron_mail_20150507.tgz"
urllib.urlretrieve(url, filename="../enron_mail_20150507.tgz")
print ("download complete!") 

我试过urllib.request。

  import urllib
  url = "https://www.cs.cmu.edu/~./enron/enron_mail_20150507.tgz"
  urllib.request(url, filename="../enron_mail_20150507.tgz")
  print ("download complete!")

但仍然给我错误。

urllib.request(url, filename="../enron_mail_20150507.tgz")
TypeError: 'module' object is not callable

我使用PyCharm作为我的IDE。

3 个答案:

答案 0 :(得分:7)

您使用urllib.request.urlretrieve。请注意,此函数“可能会在将来的某个时候被弃用”,因此您可能最好不要使用不太可能被弃用的界面:

# Adapted from the source:
# https://hg.python.org/cpython/file/3.5/Lib/urllib/request.py#l170
with open(filename, 'wb') as out_file:
    with contextlib.closing(urllib.request.urlopen(url)) as fp:
        block_size = 1024 * 8
        while True:
            block = fp.read(block_size)
            if not block:
                break
            out_file.write(block)

对于足够小的文件,您可以readwrite整个事情并完全放弃循环。

答案 1 :(得分:1)

您可以使用shutil.copyfileobj()神奇地将URL字节流复制到文件中。

    import urllib.request
    import shutil
    
    url = "http://www.somewebsite.com/something.pdf"
    output_file = "save_this_name.pdf"
    with urllib.request.urlopen(url) as response, open(output_file, 'wb') as out_file:
        shutil.copyfileobj(response, out_file)

来源:https://stackoverflow.com/a/48691447/1174102

答案 2 :(得分:0)

我知道这个问题已经得到了解答,但我会为以后的观众贡献力量。

建议的解决方案很好,但主要问题是,如果您使用无效的网址,它可以生成空文件。

作为解决此问题的方法,这里是我如何修改代码:

def getfile(url,filename,timeout=45):
    with contextlib.closing(urlopen(url,timeout=timeout)) as fp:
        block_size = 1024 * 8
        block = fp.read(block_size)
        if block:
            with open(filename,'wb') as out_file:
                out_file.write(block)
                while True:
                    block = fp.read(block_size)
                    if not block:
                        break
                    out_file.write(block)
        else:
            raise Exception ('nonexisting file or connection error')

我希望有帮助。