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