Базовая загрузка и сохранение http-файлов на диск в python?

Я новичок в Python, и я проходил через Q&A на этом сайте, для ответа на мой вопрос. Однако, я новичок и мне трудно понять некоторые решения. Мне нужно очень простое решение.

может ли кто-нибудь объяснить мне простое решение для "загрузки файла через 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:folderfile.gz")
    with open("file.gz", 'wb') as location:
        shutil.copyfileobj(dump, location)
    del dump

может ли кто-нибудь указать на ошибки (начальный уровень) и объяснить какие-либо более простые методы для этого?

спасибо!

7 ответов


чистый способ загрузки файла:

import urllib

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

загрузить файл с веб-сайта, и называет его file.gz. Это одно из моих любимых решений, от загрузка изображения через urllib и python.

в этом примере используется urllib библиотека, и она будет непосредственно извлекать файл из источника.


Как уже упоминалось здесь:

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

EDIT: Если вы все еще хотите использовать запросы, взгляните на этот вопрос или этот.


Я использую команды wget.

простая и хорошая библиотека, Если вы хотите пример?

import wget

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

file_name = wget.download(file_url)

модуль wget поддерживает версии python 2 и python 3


четыре метода с использованием 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 секунд


Экзотическое Решение Для Windows

import subprocess

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

Я начал этот путь, потому что wget ESXi не скомпилирован с 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... так что вдохновил меня пойти по этому пути


другой чистый способ сохранить файл:

import csv
import urllib

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