Podstawowe pobieranie i zapisywanie plików http na dysk w Pythonie?

Jestem nowy w Pythonie i przeglądałem pytania i odpowiedzi na moje pytanie na tej stronie. Jednak jestem początkujący i trudno mi zrozumieć niektóre z rozwiązań. Potrzebuję bardzo podstawowego rozwiązania.

Czy mógłby mi ktoś wyjaśnić proste rozwiązanie "Pobieranie pliku przez http" i "zapisywanie go na dysk, w Windows"?

Nie jestem pewien, jak korzystać z modułów shutil i os, albo.

Plik, który chcę pobrać ma poniżej 500 MB i jestgz archiwum.Jeśli ktoś może wyjaśnić, jak rozpakować archiwum i wykorzystać znajdujące się w nim pliki, to byłoby świetnie!

Oto częściowe rozwiązanie, które napisałem z różnych odpowiedzi połączonych:

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

Czy ktoś mógłby wskazać błędy (poziom początkujący) i wyjaśnić jakieś łatwiejsze metody na to?

Dzięki!
Author: arvindch, 2013-10-26

7 answers

Czystym sposobem na pobranie pliku jest:

import urllib

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

To pobiera plik ze strony internetowej i nazywa go file.gz. Jest to jedno z moich ulubionych rozwiązań, od pobierania obrazu przez urllib i python .

Ten przykład wykorzystuje bibliotekę urllib i bezpośrednio pobiera plik ze źródła.

 172
Author: Blue Ice,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 11:47:32

Jak wspomniano TUTAJ :

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

EDIT: jeśli nadal chcesz korzystać z zapytań, spójrz na to pytanie lub to pytanie .

 88
Author: dparpyani,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:02:48

Używam wget .

Prosta i dobra biblioteka, jeśli chcesz przykład?

import wget

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

file_name = wget.download(file_url)

Moduł Wget obsługuje wersje python 2 i python 3

 29
Author: Ali,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-09-13 21:38:41

Cztery metody wykorzystujące wget, urllib I 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 wywołania funkcji (4469842) w 20.236 sekund

TestRequest2 - 8580 wywołania funkcji (8574) w 0.072 sekund

TestUrllib - 3810 wywołań funkcji (3775) w 0.036 sekund

Testwget-3489 wywołanie funkcji w 0.020 sekund

 20
Author: Saurabh yadav,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-07-24 11:21:38

Exotic Windows Solution

import subprocess

subprocess.run("powershell Invoke-WebRequest {} -OutFile {}".format(your_url, filename), shell=True)
 2
Author: Brut,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-11-22 00:50:39

Zacząłem tę ścieżkę, ponieważ ESXi wget nie jest skompilowany z SSL i chciałem pobrać OVA ze strony dostawcy bezpośrednio na host ESXi, który jest po drugiej stronie świata.

Musiałem wyłączyć firewall(lazy) / włączyć https poprzez edycję reguł (proper)

Utworzono skrypt Pythona:

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)

Biblioteki ESXi są trochę sparowane, ale instalator open source Weasel wydawał się używać urllib dla https... więc to zainspirowało mnie do tego ścieżka

 0
Author: Jayme Snyder,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-06-08 15:17:57

Innym czystym sposobem zapisania pliku jest:

import csv
import urllib

urllib.retrieve("your url goes here" , "output.csv")
 -5
Author: Ala,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-01-25 15:30:34