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

arv*_*dch 141 python file download save

我是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
Run Code Online (Sandbox Code Playgroud)

有人可以指出错误(初学者级别)并解释任何更简单的方法来做到这一点?

谢谢!

Blu*_*Ice 193

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

import urllib

testfile = urllib.URLopener()
testfile.retrieve("http://randomsite.com/file.gz", "file.gz")
Run Code Online (Sandbox Code Playgroud)

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

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

  • 也许没有比自己尝试更好的可能性吗?:)我可以成功地做`testfile.retrieve("http://example.com/example.rpm","/ tmp/test.rpm")`. (17认同)
  • 自Python 3.3以来,这已被弃用,而urllib.request.urlretrieve解决方案(见下面的答案)是'现代'方式 (16认同)
  • 是否可以保存在/myfolder/file.gz中? (5认同)
  • 好,谢谢!但是有办法让它通过请求工作吗? (2认同)

dpa*_*ani 105

如前所述这里:

import urllib
urllib.urlretrieve ("http://randomsite.com/file.gz", "file.gz")
Run Code Online (Sandbox Code Playgroud)

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

  • 对于Python3:`import urllib.request``urllib.request.urlretrieve(url,filename)` (56认同)
  • urllib 可以工作,但是,许多人似乎建议通过 urllib 使用请求。为什么? (2认同)
  • 使用REST API时,`requests`与`urllib`相比非常有用.除非,你想要做更多,这应该是好的. (2认同)

Ali*_*Ali 32

我用wget.

简单而好的图书馆,如果你想要举例?

import wget

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

file_name = wget.download(file_url)
Run Code Online (Sandbox Code Playgroud)

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


Sau*_*dav 29

使用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()')
Run Code Online (Sandbox Code Playgroud)

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

testRequest2 - 8580函数调用(8574个原始调用),0.072秒

testUrllib - 3836函数调用(3775个原始调用),0.036秒

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


Om *_*Sao 6

For Python3+ URLopener is deprecated. And when used you will get error as below:

url_opener = urllib.URLopener() AttributeError: module 'urllib' has no attribute 'URLopener'

So, try:

import urllib.request 
urllib.request.urlretrieve(url, filename)
Run Code Online (Sandbox Code Playgroud)

  • 奇怪...为什么当 Python 2 被弃用并且只有这个解决方案应该正常工作时没有人投票支持这个答案... (6认同)
  • 同意!我对早期的解决方案感到困惑。希望我能点赞200次! (3认同)

Bru*_*rut 5

异国情调的 Windows 解决方案

import subprocess

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