Использование urllib2 в Python. Как получить имя файла, который я загружаю? - PullRequest
5 голосов
/ 04 апреля 2011

Я начинающий питон. Я использую urllib2 для загрузки файлов. Когда я загружаю файл, я указываю имя файла, с которым сохранить загруженный файл на моем жестком диске. Однако, если я загружаю файл с помощью браузера, автоматически предоставляется имя файла по умолчанию.

Вот упрощенная версия моего кода:

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

Файл загружается просто отлично, но если я наберу строку, хранящуюся в переменной «url», в моем браузере, при загрузке файла файлу будет присвоено имя по умолчанию. Я хочу использовать это имя файла для загруженного файла, а не для temp.zip или чего-то еще, что я ему назначил.

Как мне использовать urllib2 (или какую-то другую библиотеку Python), чтобы сохранить файл с именем файла, который сервер, с которого я загружаю, намеревается иметь его?

Если кто-то не понимает этот вопрос, скажите, пожалуйста, чтобы я мог попытаться прояснить его.

Ответы [ 4 ]

7 голосов
/ 04 апреля 2011

Имя файла обычно включается сервером через заголовок расположения контента:

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

Но помните, что этот заголовок не обязательно должен присутствовать. В противном случае вам нужно создать разумное имя самостоятельно из запрошенного URL-адреса - например, из последнего компонента URI. В этом случае используйте метод urlparse () Python.

1 голос
/ 11 мая 2015

Моя проблема с предыдущими ответами заключается в том, что они использовали исходный URL, и в случае перенаправления произойдет сбой. Вот как я это делаю: (обратите внимание на использование result.url вместо url)

import os
import urllib2
result = urllib2.urlopen(url)
filename = os.path.basename(urllib2.urlparse.urlparse(result.url).path)
0 голосов
/ 30 сентября 2014

У меня была проблема, когда сервер не давал мне заголовок content-disposition, поэтому, если это также ваш случай, вы можете извлечь имя файла из URL следующим образом:

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, также обрабатывая дублированные имена файлов, добавляя случайные символы в конце:)

Высокий.

0 голосов
/ 04 апреля 2011

Вы можете сделать это, используя urlretrieve:

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

...