182

我是 Python 新手,我一直在浏览这个网站上的问答,以回答我的问题。但是,我是初学者,我发现很难理解一些解决方案。我需要一个非常基本的解决方案。

有人可以向我解释一下“通过http下载文件”和“在Windows中将其保存到磁盘”的简单解决方案吗?

我也不确定如何使用 shutil 和 os 模块。

我要下载的文件小于 500 MB,是一个 .gz 存档文件。如果有人可以解释如何提取存档并利用其中的文件,那就太好了!

这是一个部分解决方案,我结合各种答案编写:

import requests
import os
import shutil

global dump

def download_file():
    global dump
    url = "http://randomsite.com/file.gz"
    file = requests.get(url, stream=True)
    dump = file.raw

def save_file():
    global dump
    location = os.path.abspath("D:\folder\file.gz")
    with open("file.gz", 'wb') as location:
        shutil.copyfileobj(dump, location)
    del dump

有人可以指出错误(初级)并解释任何更简单的方法吗?

谢谢!

4

10 回答 10

225

下载文件的一种干净方法是:

import urllib

testfile = urllib.URLopener()
testfile.retrieve("http://randomsite.com/file.gz", "file.gz")

这将从网站下载一个文件并命名它file.gz。这是我最喜欢的解决方案之一,来自通过 urllib 和 python 下载图片

此示例使用该urllib库,它将直接从源中检索文件。

于 2013-10-26T04:59:08.690 回答
119

如此处所述:

import urllib
urllib.urlretrieve ("http://randomsite.com/file.gz", "file.gz")

EDIT:如果您仍想使用 requests,请查看this questionthis one

于 2013-10-26T05:00:46.763 回答
106

对于Python3+ URLopener已弃用。使用时会出现如下错误:

url_opener = urllib.URLopener() AttributeError: 模块 'urllib' 没有属性 'URLopener'

所以,试试:

import urllib.request 
urllib.request.urlretrieve(url, filename)
于 2019-05-14T11:10:18.680 回答
36

使用 wget、urllib 和 request 的四种方法。

#!/usr/bin/python
import requests
from StringIO import StringIO
from PIL import Image
import profile as profile
import urllib
import wget


url = 'https://tinypng.com/images/social/website.jpg'

def testRequest():
    image_name = 'test1.jpg'
    r = requests.get(url, stream=True)
    with open(image_name, 'wb') as f:
        for chunk in r.iter_content():
            f.write(chunk)

def testRequest2():
    image_name = 'test2.jpg'
    r = requests.get(url)
    i = Image.open(StringIO(r.content))
    i.save(image_name)

def testUrllib():
    image_name = 'test3.jpg'
    testfile = urllib.URLopener()
    testfile.retrieve(url, image_name)

def testwget():
    image_name = 'test4.jpg'
    wget.download(url, image_name)

if __name__ == '__main__':
    profile.run('testRequest()')
    profile.run('testRequest2()')
    profile.run('testUrllib()')
    profile.run('testwget()')

testRequest - 4469882 次函数调用(4469842 次原始调用)在 20.236 秒内

testRequest2 - 8580 次函数调用(8574 次原始调用)在 0.072 秒内

testUrllib - 3810 次函数调用(3775 次原始调用)在 0.036 秒内

testwget - 3489 次函数调用在 0.020 秒内

于 2017-07-24T11:21:38.720 回答
35

我使用wget

如果你想举例,简单而好的库?

import wget

file_url = 'http://johndoe.com/download.zip'

file_name = wget.download(file_url)

wget 模块支持 python 2 和 python 3 版本

于 2014-09-13T21:13:57.953 回答
5

异国情调的 Windows 解决方案

import subprocess

subprocess.run("powershell Invoke-WebRequest {} -OutFile {}".format(your_url, filename), shell=True)
于 2017-11-22T00:50:39.307 回答
2
import urllib.request
urllib.request.urlretrieve("https://raw.githubusercontent.com/dnishimoto/python-deep-learning/master/list%20iterators%20and%20generators.ipynb", "test.ipynb")

将单个原始 juypter notebook 下载到文件中。

于 2021-01-25T18:31:56.063 回答
1

我开始走这条路是因为 ESXi 的 wget 没有使用 SSL 编译,我想从供应商的网站直接下载 OVA 到世界另一端的 ESXi 主机上。

我必须通过编辑规则来禁用防火墙(惰性)/启用 https (正确)

创建了python脚本:

import ssl
import shutil
import tempfile
import urllib.request
context = ssl._create_unverified_context()

dlurl='https://somesite/path/whatever'
with urllib.request.urlopen(durl, context=context) as response:
    with open("file.ova", 'wb') as tmp_file:
        shutil.copyfileobj(response, tmp_file)

ESXi 库有点成对,但开源 weasel 安装程序似乎使用 urllib 进行 https ......所以它启发了我走这条路

于 2018-06-08T15:03:25.680 回答
0

对于文本文件,您可以使用:

import requests

url = 'https://WEBSITE.com'
req = requests.get(url)
path = "C:\\YOUR\\FILE.html"

with open(path, 'wb') as f:
    f.write(req.content)
于 2020-09-21T07:17:15.407 回答
-6

另一种保存文件的干净方法是:

import csv
import urllib

urllib.retrieve("your url goes here" , "output.csv")
于 2014-09-30T16:46:39.187 回答