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

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

Может ли кто-нибудь объяснить простое решение для "Загрузка файла через http" и "Сохранение его на диск, в Windows", для меня?

Я не уверен, как использовать модули shutal и os.

Файл, который я хочу загрузить, составляет менее 500 МБ и является файлом архива .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

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

Спасибо!

Ответ 1

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

import urllib

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

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

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

Ответ 2

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

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

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

Ответ 3

Я использую wget.

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

import wget

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

file_name = wget.download(file_url)

Поддержка wget-модуля python 2 и версии python 3

Ответ 4

Четыре метода с использованием wget, urllib и запроса.

#!/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 секунды

Ответ 5

Экзотическое решение для Windows

import subprocess

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

Ответ 6

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

Ответ 7

Для Python3+ URLopener устарел. И при использовании вы получите ошибку, как показано ниже:

url_opener = urllib.URLopener() AttributeError: модуль 'urllib' не имеет атрибута 'URLopener'

Так что постарайтесь:

import urllib.request 
urllib.request.urlretrieve(url, filename)

Ответ 8

Другим чистым способом сохранения файла является следующее:

import csv
import urllib

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