2013-02-22 71 views
15

Tôi hiện đang viết một tập lệnh có một url hình ảnh và tải nó xuống một tệp được đặt tên trước.Lệnh nào để sử dụng thay vì urllib.request.urlretrieve?

Dưới đây là phần có liên quan của mã của tôi:

import urllib.request 

urllib.request.urlretrieve(image['url'],p) 

Phải mất 'url' và lưu nó như 'p'.

Theo tài liệu trăn, urllib.request.urlretrieve là giao diện kế thừa và có thể bị phản đối trong tương lai, do đó tôi muốn tránh nó nếu có thể, vì vậy tôi không phải viết lại sớm.

Tôi đã cố gắng tìm một lệnh khác cho phép tôi thực hiện command(url,filename) nhưng chưa có bất kỳ may mắn nào.

Các bạn có một số lời khuyên hay về lệnh tôi nên sử dụng thay thế không?

Ồ, và tôi cũng muốn tránh sử dụng thư viện bên ngoài nếu có thể.

Trả lời

17

Không dùng nữa là một chuyện, có thể trở nên bị phản đối tại một số điểm trong tương lai là chuyện khác.

Nếu nó phù hợp với nhu cầu của bạn, tôi sẽ tiếp tục sử dụng urlretrieve.

Điều đó nói rằng, bạn có thể làm mà không có nó:

from urllib.request import urlopen 
from shutil import copyfileobj 

with urlopen(image['url']) as in_stream, open(p, 'wb') as out_file: 
    copyfileobj(in_stream, out_file) 
+1

Cảm ơn rất nhiều. Tôi không có ý tưởng thư viện shutil thậm chí tồn tại :) – Marc2540

+0

Wow, điều này làm việc rất đẹp. Tôi đang tìm kiếm cùng một thứ, nhưng đối với những mẩu âm thanh nhỏ, và không thể tìm ra cách để lưu nó vào một tập tin. Không tìm thấy 'urlretrieve' trong một thời gian, và tôi đã không nhận ra rằng' urlopen' sẽ cho tôi các byte - tôi nghĩ tôi nên tìm một phương thức có thể lưu tệp, không đi vào tệp và đọc/lưu các bit. Tôi đoán đây là thực hành tiêu chuẩn với lập trình vì vậy nó nên có ý nghĩa, nhưng tôi chưa bao giờ làm việc với I/O trước đây. Cảm ơn bạn, đó là cách đơn giản hơn tôi sợ nó có thể được. –

+0

Cảm ơn bạn đã copyfileobj! Vấn đề với 'urlretrieve' là nó không có cách nào để xác định lỗi máy chủ (502/404/bất cứ điều gì). – y0prst

2

Bạn có thể sử dụng urllib2; bạn có lẽ nên sử dụng requests

urllib là di sản

urllib2 là vượt quá đau đớn để sử dụng

+0

Tôi có lẽ đã đề cập đến điều này trong phần nội dung bài đăng của mình chứ không chỉ các thẻ, nhưng tôi đang sử dụng python 3.3 trong đó urllib2 đã được hợp nhất thành urllib. – Marc2540

10

yêu cầu là thật sự tốt đẹp cho việc này. Có một vài phụ thuộc mặc dù để cài đặt nó. Đây là một ví dụ.

import requests 
r = requests.get('imgurl') 
with open('pic.jpg','wb') as f: 
    f.write(r.content) 
0

tôi muốn thêm rằng điều này cũng làm việc trên các tập tin xml.

0

Một giải pháp khác mà không cần sử dụng shutil và không có thư viện bên ngoài nào khác như requests.

import urllib.request 

image = {'url': 'https://cdn.sstatic.net/Sites/stackoverflow/img/appletouch-icon.png'} 
p = 'image.png' 

response = urllib.request.urlopen(image['url']) 
image = response.read() 

file = open(p, 'wb') 

file.write(image) 
file.close() 
+0

Xin chào và chào mừng đến với SO. Các câu trả lời chỉ có mã được coi là ít hữu ích hơn. Vui lòng chỉnh sửa câu trả lời của bạn để thêm một số ngữ cảnh và giải thích giải pháp của bạn. –