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


159

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

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

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

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

Спасибо!

Ответы:


207

Чистый способ скачать файл:

import urllib

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

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

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


3
Хорошо, спасибо! Но есть ли способ заставить его работать через запросы?
arvindch

5
Любая возможность сохранить в /myfolder/file.gz?
Джон Сноу

17
Может быть, нет лучшей возможности, чем попробовать самому? :) Я мог бы успешно сделать testfile.retrieve("http://example.com/example.rpm", "/tmp/test.rpm").
Дхармит

18
Это не рекомендуется с Python 3.3, и решение urllib.request.urlretrieve (см. Ответ ниже) является «современным» способом
MichielB

1
Как лучше всего добавить имя пользователя и пароль к этому коду? tks
Estefy

110

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

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

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


1
urllib будет работать, однако многие люди рекомендуют использовать запросы вместо urllib. Почему это?
arvindch

2
requestsЭто чрезвычайно полезно по сравнению с urllibработой с REST API. Если вы не хотите делать намного больше, это должно быть хорошо.
дпарпяни

Хорошо, теперь я прочитал ссылки, которые вы предоставили для использования запросов. Я запутался в том, как объявить путь к файлу для сохранения загрузки. Как мне использовать os и shutil для этого?
arvindch

62
Для Python3:import urllib.request urllib.request.urlretrieve(url, filename)
Вспышка

1
Я не могу извлечь код состояния http с этим, если загрузка не удалась
Aashish Thite

34

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

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

import wget

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

file_name = wget.download(file_url)

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


33

Четыре метода, использующих 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 секунды


1
Как вы получили количество вызовов функций?
Абдельхак

30

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

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

Поэтому постарайтесь:

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

1
Странно ... Почему никто не голосует за этот ответ, когда Python 2 устарел, и только это решение должно работать правильно ...
wowkin2

1
Согласовано! Я дергал себя за более ранние решения. Хотелось бы, чтобы я проголосовал 200 раз!
Йехиэль К

5

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

import subprocess

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

1

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


-5

Еще один простой способ сохранить файл:

import csv
import urllib

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

Это должно быть urllib.urlretrieveили urllib.URLopener().retrieve, непонятно, что вы имели в виду здесь.
Метеор

9
Почему вы импортируете CSV, если вы просто называете файл?
Azeezah M
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.