web-dev-qa-db-fra.com

Téléchargement de fichier http de base et enregistrement sur disque en python?

Je connais Python pour la première fois et je viens de répondre aux questions sur ce site pour trouver une réponse à ma question. Cependant, je suis débutant et j'ai du mal à comprendre certaines des solutions. J'ai besoin d'une solution très basique.

Quelqu'un pourrait-il m'expliquer une solution simple permettant de "télécharger un fichier via http" et de "l'enregistrer sur un disque, sous Windows"?

Je ne sais pas non plus comment utiliser les modules shutil et os.

Le fichier que je veux télécharger fait moins de 500 Mo. Il s’agit d’un fichier d’archive .gz. Si quelqu'un peut expliquer comment extraire l’archive et utiliser les fichiers qu’elle contient également, ce serait formidable!

Voici une solution partielle, que j'ai écrite à partir de diverses réponses combinées:

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

Quelqu'un pourrait-il signaler des erreurs (niveau débutant) et expliquer des méthodes plus simples pour le faire?

Merci!

127
arvindch

Un moyen propre de télécharger un fichier est:

import urllib

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

Cela télécharge un fichier depuis un site Web et le nomme file.gz. C’est l’une de mes solutions préférées, depuis Télécharger une image via urllib et python .

Cet exemple utilise la bibliothèque urllib et récupérera directement le fichier sous forme de source.

182
Blue Ice

Comme mentionné ici :

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

EDIT: Si vous voulez toujours utiliser les requêtes, jetez un coup d'œil à cette question ou celle-ci .

97
dparpyani

J'utilise wget .

Bibliothèque simple et bonne si vous voulez par exemple?

import wget

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

file_name = wget.download(file_url)

le module wget supporte les versions python 2 et python 3

31
Ali

Quatre méthodes utilisant wget, urllib et 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 __== '__main__':
    profile.run('testRequest()')
    profile.run('testRequest2()')
    profile.run('testUrllib()')
    profile.run('testwget()')

testRequest - Appels de fonction 4469882 (appels primitifs 4469842) en 20.236 secondes

testRequest2 - 8580 appels de fonction (8574 appels primitifs) en 0.072 secondes

testUrllib - 3810 appels de fonction (3775 appels primitifs) en 0.036 secondes

testwget - 3489 appels de fonction en 0.020 secondes

24
Saurabh yadav

Solution Windows exotique

import subprocess

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

Pour Python3 + URLopener est obsolète. Et une fois utilisé, vous obtiendrez une erreur comme ci-dessous:

url_opener = urllib.URLopener () AttributeError: le module 'urllib' n'a pas d'attribut 'URLopener'

Alors, essayez:

import urllib.request 
urllib.request.urlretrieve(url, filename)
0
Om Prakash Sao

J'ai commencé dans cette voie car le wget d'ESXi n'est pas compilé avec SSL et je voulais télécharger un fichier OVA à partir du site Web du fournisseur directement sur l'hôte ESXi, qui se trouve de l'autre côté du monde.

Je devais désactiver le pare-feu (paresseux)/activer la sortie https en modifiant les règles (correctes)

créé le script 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)

Les bibliothèques ESXi sont en quelque sorte couplées, mais l'installateur open source weasel semblait utiliser urllib pour https ... ce qui m'a inspiré à aller dans cette voie.

0
Jayme Snyder