2011-04-04 16 views
5

Ben bir piton başladım. Dosyaları indirmek için urllib2 kullanıyorum. Bir dosyayı indirdiğimde, indirilen dosyayı sabit diskime kaydetmek için bir dosya adı belirtiyorum. Ancak, tarayıcımı kullanarak dosyayı indirirseniz, varsayılan bir dosya adı otomatik olarak sağlanır. İşte Python'da urllib2'yi kullanma. İndirdiğim dosyanın adını nasıl alabilirim?

benim kod basitleştirilmiş bir versiyonudur:

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

dosya indirme gayet ama benim tarayıcıya değişkeni "url" saklanan dize yazarsanız, verilen varsayılan bir dosya adı yoktur dosyayı indirdiğimde. İndirdiğim dosya için 'temp.zip' veya onu atarsam ne olursa olsun bu dosya adını kullanmak istiyorum.

Dosyayı, indirdiğim sunucunun sahip olduğu dosya adıyla kaydetmek için urllib2'yi (veya başka bir Python kitaplığı) nasıl kullanırım?

Eğer kimse bu soruyu anlamıyorsa, lütfen söyleyin, böylece daha net hale getirmeye çalışıyorum.

+1

olası yinelenen [urllib2 dosya adı] (http://stackoverflow.com/questions/163009/urllib2-file-name) –

+0

(result.url yerine url ait kullanımını dikkat edin): İşte bunun için gereken adımları Bir dosya adı aramak için iki yer vardır: İçerik-Atma başlığı alanı ve URL. Başlık alanını ayrıştırmak için cgi.parse_header() öğesini kullanın.URL'yi ayrıştırmak için urlparse()/urlsplit() ve posixpath.basename() kullanın. Örnekler için bu cevaba bakın: http://stackoverflow.com/a/11783319/205212 –

cevap

7

dosya adı genellikle içerik-disposition başlığı sayesinde sunucu tarafından dahildir:

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

Bkz

content-disposition: attachment; filename=foo.pdf 

Sen başlıklarına erişebilir

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'] 

aracılığıyla Ancak, bu başlığın gerekmediğine dikkat edin mevcut ol. Aksi takdirde, istenen URL’den kendiniz için makul bir ad oluşturmanız gerekir - ör. URI'nin son bileşeninden. Bu durumda Python'un urlparse() yöntemini kullanın.

0

Ben senin davan da eğer, böyle url dosya adını ayıklamak, böylece sunucu bana herhangi content-disposition başlık vermedi sorunu vardı:

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

, ben dosya uzantısı içeriyordu file_stream.headers.subtype kullanılan ve benim Django modeli sümüklü böcek dayalı dosyaları yeniden adlandırılmış, burada bir örnek:

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)) 

Son hattı da sonunda rasgele karakterler ekleyerek çoğaltılamaz dosya adlarını taşıma, django yöntemini kaydetmek kullanarak dosyayı kaydediyor :)

Muhteşem.

1

Sorunum önceki yanıtlarla, orijinal URL kullanıyor olmaları ve yönlendirme durumunda başarısız olmaları.

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