基本的HTTP文件下载并保存到python中的磁盘上?


159

我是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

有人可以指出错误(初学者水平)并解释执行此操作的更简单方法吗?

谢谢!

Answers:


207

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

import urllib

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

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

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


3
好,谢谢!但是有办法让它通过请求工作吗?
arvindch 2013年

5
是否可以保存在/myfolder/file.gz中?
约翰·斯诺

17
没有比尝试自己更好的可能了吗?:)我可以成功做到testfile.retrieve("http://example.com/example.rpm", "/tmp/test.rpm")
Dharmit 2014年

18
自Python 3.3起已弃用此方法,而urllib.request.urlretrieve解决方案(请参见下面的答案)是“现代”方式
MichielB

1
在此代码中添加用户名和密码的最佳方法是什么?tks
Estefy

110

如前所述这里

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

EDIT:如果您仍想使用请求,请查看此问题问题


1
urllib可以使用,但是,很多人似乎建议在urllib上使用请求。为什么?
arvindch 2013年

2
requestsurllib与使用REST API 相比,它非常有用。除非您希望做更多事情,否则这应该很好。
dparpyani

好的,现在我已经阅读了您为请求使用提供的链接。我对如何声明文件路径以保存下载感到困惑。我该如何使用os和shutil?
arvindch

62
对于Python3:import urllib.request urllib.request.urlretrieve(url, filename)
Flash

1
如果下载失败,我将无法由此提取http状态代码
Aashish Thite

34

我用wget

如果您想举例说明简单而又好的库?

import wget

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

file_name = wget.download(file_url)

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


33

四种使用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-在20.236秒内调用4469882函数(4469842基本调用)

testRequest2-8580个函数调用(8574个基本调用)在0.072秒内

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

testwget-在0.020秒内调用3489函数


1
您如何获得函数调用的数量?
阿卜杜勒克(Abdelhak)'18

29

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

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

因此,请尝试:

import urllib.request 
urllib.request.urlretrieve(url, filename)

1
奇怪...为什么不赞成使用Python 2,而只有此解决方案才能正常工作?
wowkin2

1
同意!我正在为早期的解决方案拉扯头发。希望我能投票200次!
Yechiel K

5

异国Windows解决方案

import subprocess

subprocess.run("powershell Invoke-WebRequest {} -OutFile {}".format(your_url, filename), shell=True)

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库是配对的,但是开源的鼬鼠安装程序似乎将urllib用于https ...因此启发了我走这条路


-5

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

import csv
import urllib

urllib.retrieve("your url goes here" , "output.csv")

这可能是urllib.urlretrieveurllib.URLopener().retrieve,不清楚您在此表示的意思。
主教

9
如果仅命名文件,为什么要导入csv?
Azeezah M
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.