बेसिक http फ़ाइल डाउनलोड करना और अजगर में डिस्क पर सहेजना?


159

मैं पायथन के लिए नया हूं और अपने प्रश्न के उत्तर के लिए मैं इस साइट पर प्रश्नोत्तर के माध्यम से जा रहा हूं। हालांकि, मैं एक शुरुआती हूं और मुझे कुछ समाधानों को समझना मुश्किल है। मुझे बहुत बुनियादी समाधान की आवश्यकता है।

क्या कोई व्यक्ति 'http के माध्यम से किसी फ़ाइल को डाउनलोड करना' और 'डिस्क पर सहेजना, Windows में' मेरे लिए एक सरल समाधान बता सकता है?

मुझे यकीन नहीं है कि शील और ओएस मॉड्यूल का उपयोग कैसे किया जाए।

जिस फ़ाइल को मैं डाउनलोड करना चाहता हूँ, वह 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लाइब्रेरी का उपयोग करता है , और यह सीधे फाइल फॉर्म को एक स्रोत के रूप में पुनः प्राप्त करेगा।


3
ठीक है धन्यवाद! लेकिन क्या अनुरोधों के माध्यम से इसे प्राप्त करने का कोई तरीका है?
अरविंद

5
/Myfolder/file.gz में सहेजने की कोई संभावना है?
जॉन स्नो

17
खुद को आजमाने से बेहतर कोई संभावना नहीं, हो सकता है? :) मैं सफलतापूर्वक कर सकता था testfile.retrieve("http://example.com/example.rpm", "/tmp/test.rpm")
धर्मित

18
यह पायथन 3.3 के बाद से हटा दिया गया है, और urllib.request.urlretrieve समाधान (नीचे उत्तर देखें) 'आधुनिक' तरीका है
MichielB

1
इस कोड में उपयोगकर्ता नाम और पासवर्ड जोड़ने का सबसे अच्छा तरीका क्या है? tks
एस्टेफी

110

उल्लेखानुसार यहां है :

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

EDIT:यदि आप अभी भी अनुरोधों का उपयोग करना चाहते हैं, तो इस प्रश्न या इस पर एक नज़र डालें ।


1
urllib काम करेगा, हालाँकि, बहुत से लोग urllib पर अनुरोधों के उपयोग की सलाह देते हैं। यही कारण है कि?
अरविंद

2
requestsurllibREST API के साथ काम करने की तुलना में बेहद मददगार है। जब तक, आप बहुत कुछ करना चाहते हैं, यह अच्छा होना चाहिए।
दपरफनी

ठीक है, अब मैंने उन लिंक्स को पढ़ा है जो आपने अनुरोधों के उपयोग के लिए प्रदान किए हैं। मैं फ़ाइल पथ को डाउनलोड करने के तरीके को घोषित करने के बारे में उलझन में हूं। मैं इसके लिए ओएस और शील का उपयोग कैसे करूं?
अरविंद

62
पायथन 3 के लिए: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)

विजेट मॉड्यूल अजगर 2 और अजगर 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 - 8572 फ़ंक्शन कॉल (8574 आदिम कॉल) 0.072 सेकंड में

testUrllib - 3836 फ़ंक्शन कॉल (3775 आदिम कॉल) 0.036 सेकंड में

टेस्टवेट - ३४ callsw फंक्शन कॉल सेकंड्स में


1
आपको फ़ंक्शन कॉल की संख्या कैसे मिली?
अब्देलहाक

29

के लिए python3 + URLopener मान्य नहीं है। और जब उपयोग किया जाता है तो आपको नीचे के रूप में त्रुटि मिलेगी:

url_opener = urllib.URLopener () विशेषता गुण: मॉड्यूल 'urllib' में कोई विशेषता नहीं है 'URLopener'

इसलिए कोशिश करें:

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

1
अजीब ... इस जवाब के लिए कोई भी वोट क्यों नहीं देता जब अजगर 2 पदावनत हो गया और केवल इस समाधान को ठीक से काम करना चाहिए ...
wowkin2

1
माना! मैं पहले के समाधानों पर अपने बाल खींच रहा था। काश मैं 200 बार उत्थान कर पाता!
येचुएल के

5

विदेशी विंडोज समाधान

import subprocess

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

1

मैंने इस रास्ते को शुरू कर दिया क्योंकि ईएसएक्सआई का दांव एसएसएल के साथ संकलित नहीं है और मैं एक विक्रेता की वेबसाइट से सीधे ओएक्सएक्स होस्ट पर एक ओवीए डाउनलोड करना चाहता था जो दुनिया के दूसरी तरफ है।

मुझे फ़ायरवॉल (आलसी) को अक्षम करना था / नियम (उचित) का संपादन करके https को सक्षम करना था

अजगर स्क्रिप्ट बनाई:

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 पुस्तकालयों की तरह नीचे गिरा दिया है, लेकिन खुले स्रोत weasel इंस्टॉलर https के लिए urllib का उपयोग करने के लिए लग रहा था ... तो इसने मुझे इस रास्ते पर जाने के लिए प्रेरित किया


-5

फाइल को बचाने का एक और साफ तरीका यह है:

import csv
import urllib

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

यह शायद urllib.urlretrieveया urllib.URLopener().retrieve, अस्पष्ट होना चाहिए जो आप यहाँ थे।
२४:१६

9
यदि आप किसी फ़ाइल का नामकरण कर रहे हैं तो आप csv आयात क्यों करते हैं?
अज़ीज़ा एम
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.