2011-04-04 23 views
5

मैं एक अजगर शुरुआत कर रहा हूं। मैं फ़ाइलों को डाउनलोड करने के लिए urllib2 का उपयोग कर रहा हूँ। जब मैं एक फ़ाइल डाउनलोड करता हूं, तो मैं एक फ़ाइल नाम निर्दिष्ट करता हूं जिसके साथ डाउनलोड की गई फ़ाइल को मेरी हार्ड ड्राइव पर सहेजना है। हालांकि, अगर मैं अपने ब्राउज़र का उपयोग कर फ़ाइल डाउनलोड करता हूं, तो एक डिफ़ॉल्ट फ़ाइल नाम स्वचालित रूप से प्रदान किया जाता है।पायथन में urllib2 का उपयोग करना। मैं जिस फ़ाइल को डाउनलोड कर रहा हूं उसका नाम कैसे प्राप्त करूं?

यहाँ मेरी कोड का एक सरलीकृत संस्करण है:

def downloadmp3(url): 
    webFile = urllib2.urlopen(url) 
    filename = 'temp.zip' 
    localFile = open(filename, 'w') 
    localFile.write(webFile.read()) 

फ़ाइल डाउनलोड ठीक है, लेकिन अगर मैं अपने ब्राउज़र में वैरिएबल "url" में संग्रहीत स्ट्रिंग टाइप करें, वहाँ एक डिफ़ॉल्ट के लिए दिया फ़ाइल नाम है फाइल जब मैं इसे डाउनलोड करता हूं। मैं इस फ़ाइल नाम का उपयोग अपनी डाउनलोड की गई फ़ाइल के लिए 'temp.zip' या जो भी मैं इसे असाइन करता हूं, के लिए नहीं करना चाहता।

फ़ाइल को फ़ाइल नाम से सहेजने के लिए urllib2 (या कुछ अन्य पायथन लाइब्रेरी) का उपयोग कैसे करें, जिसे मैं डाउनलोड करने वाले सर्वर से डाउनलोड कर रहा हूं?

अगर कोई इस प्रश्न को नहीं समझता है, तो कृपया ऐसा कहें, ताकि मैं इसे स्पष्ट करने की कोशिश कर सकूं।

+1

संभव डुप्लिकेट [urllib2 फ़ाइल नाम] (http://stackoverflow.com/questions/163009/urllib2-file-name) –

+0

(result.urlurl के बजाय के उपयोग पर ध्यान दें): यहाँ मैं इसे कैसे करते हैं फ़ाइल नाम देखने के लिए दो स्थान हैं: सामग्री-डिस्पोजिशन हेडर फ़ील्ड और यूआरएल। हेडर फ़ील्ड को पार्स करने के लिए cgi.parse_header() का उपयोग करें।URL को पार्स करने के लिए urlparse()/urlsplit() और posixpath.basename() का उपयोग करें। उदाहरण के लिए यह उत्तर देखें: http://stackoverflow.com/a/11783319/205212 –

उत्तर

7

फ़ाइल नाम आमतौर पर सामग्री-स्वभाव हेडर के माध्यम से सर्वर द्वारा शामिल है:

content-disposition: attachment; filename=foo.pdf 

आप हेडर की पहुंच है

के माध्यम से
result = urllib2.urlopen(...) 
result.info() <- contains the headers 


i>>> import urllib2 
ur>>> result = urllib2.urlopen('http://zopyx.com') 
>>> print result 
<addinfourl at 4302289808 whose fp = <socket._fileobject object at 0x1006dd5d0>> 
>>> result.info() 
<httplib.HTTPMessage instance at 0x1006fbab8> 
>>> result.info().headers 
['Date: Mon, 04 Apr 2011 02:08:28 GMT\r\n', 'Server: Zope/(unreleased version, python 2.4.6, linux2) ZServer/1.1 Plone/3.3.4\r\n', 'Content-Length: 15321\r\n', 'Content-Type: text/html; charset=utf-8\r\n', 'Via: 1.1 www.zopyx.com\r\n', 'Cache-Control: max-age=3600\r\n', 'Expires: Mon, 04 Apr 2011 03:08:28 GMT\r\n', 'Connection: close\r\n'] 

http://docs.python.org/library/urllib2.html

देखें लेकिन ध्यान रखें कि इस शीर्षलेख की आवश्यकता नहीं है उपस्थित रहें। अन्यथा आपको अनुरोध किए गए यूआरएल से उचित नाम उत्पन्न करना होगा - उदा। यूआरआई के अंतिम घटक से। इस मामले में पायथन के urlparse() विधि का उपयोग करें।

0

मैं एक मुद्दा जहां सर्वर इसलिए यदि यह भी अपने बात है तो आपको फ़ाइल नाम यूआरएल से इस तरह निकाल सकते हैं मुझे किसी भी content-disposition हैडर नहीं दिया था:

os.path.basename(urlparse.urlparse(file_url)) 

मेरे मामले में, मैं file_stream.headers.subtype जो फाइल एक्सटेंशन निहित इस्तेमाल किया और मैं अपने Django के मॉडल स्लग के आधार पर फ़ाइलों का नाम बदला, यहाँ एक उदाहरण है:

import urlparse, os 

tmp_file = NamedTemporaryFile(delete=True) 
file_stream = urllib2.urlopen(file_url) 
tmp_file.write(file_stream.read()) 
tmp_file.flush() 

new_file_name = "some_prefix_" + my_model.slug + "." + file_stream.headers.subtype 
#You may prefer this: 
# new_file_name = os.path.basename(urlparse.urlparse(file_url)) 

my_model.file.save(new_file_name, File(tmp_file)) 

अंतिम पंक्ति Django की विधि को बचाने का उपयोग कर फ़ाइल की बचत है, यह भी अंत में यादृच्छिक पात्रों जोड़कर दोहराया फ़ाइल नाम से निपटने :)

बहुत बढ़िया।

1

पिछले उत्तरों के साथ मेरा मुद्दा यह है कि वे मूल URL का उपयोग कर रहे थे, और यह एक रीडायरेक्ट के मामले में विफल हो जाएगा।

import os 
import urllib2 
result = urllib2.urlopen(url) 
filename = os.path.basename(urllib2.urlparse.urlparse(result.url).path) 
की