Базовая загрузка и сохранение 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")