What command to use instead of urllib.request.urlretrieve?
Question:
I’m currently writing a script that downloads a file from a URL
import urllib.request
urllib.request.urlretrieve(my_url, 'my_filename')
The docs urllib.request.urlretrieve
state:
The following functions and classes are ported from the Python 2 module urllib (as opposed to urllib2). They might become deprecated at some point in the future.
Therefore I would like to avoid it so I don’t have to rewrite this code in the near future.
I’m unable to find another interface like download(url, filename)
in standard libraries. If urlretrieve
is considered a legacy interface in Python 3, what is the replacement?
Answers:
requests is really nice for this. There are a few dependencies though to install it. Here is an example.
import requests
r = requests.get('imgurl')
with open('pic.jpg','wb') as f:
f.write(r.content)
Deprecated is one thing, might become deprecated at some point in the future is another. If it suits your needs, I’d continuing using urlretrieve
.
That said, you can use shutil.copyfileobj
:
from urllib.request import urlopen
from shutil import copyfileobj
with urlopen(my_url) as in_stream, open('my_filename', 'wb') as out_file:
copyfileobj(in_stream, out_file)
Another solution without the use of shutil
and no other external libraries like requests
.
import urllib.request
image_url = "https://cdn.sstatic.net/Sites/stackoverflow/img/apple-touch-icon.png"
response = urllib.request.urlopen(image_url)
image = response.read()
with open("image.png", "wb") as file:
file.write(image)
Not sure if this is what you’re looking for, or if there’s a "better" way, but this is what I added to the top of my script after the libraries, to make my script compatible with Python 2/3.
# Python version compatibility
if version.major == 3:
from urllib.error import HTTPError
from urllib.request import urlopen, urlretrieve
elif version.major == 2:
from urllib2 import HTTPError, urlopen
def urlretrieve(url, data):
url_data = urlopen(url)
with open(data, "wb") as local_file:
local_file.write(url_data.read())
else:
raise ValueError('No valid Python interpreter found.')
It at least seems like a handy trick, and I hope this might help someone.
Best!
I’m currently writing a script that downloads a file from a URL
import urllib.request
urllib.request.urlretrieve(my_url, 'my_filename')
The docs urllib.request.urlretrieve
state:
The following functions and classes are ported from the Python 2 module urllib (as opposed to urllib2). They might become deprecated at some point in the future.
Therefore I would like to avoid it so I don’t have to rewrite this code in the near future.
I’m unable to find another interface like download(url, filename)
in standard libraries. If urlretrieve
is considered a legacy interface in Python 3, what is the replacement?
requests is really nice for this. There are a few dependencies though to install it. Here is an example.
import requests
r = requests.get('imgurl')
with open('pic.jpg','wb') as f:
f.write(r.content)
Deprecated is one thing, might become deprecated at some point in the future is another. If it suits your needs, I’d continuing using urlretrieve
.
That said, you can use shutil.copyfileobj
:
from urllib.request import urlopen
from shutil import copyfileobj
with urlopen(my_url) as in_stream, open('my_filename', 'wb') as out_file:
copyfileobj(in_stream, out_file)
Another solution without the use of shutil
and no other external libraries like requests
.
import urllib.request
image_url = "https://cdn.sstatic.net/Sites/stackoverflow/img/apple-touch-icon.png"
response = urllib.request.urlopen(image_url)
image = response.read()
with open("image.png", "wb") as file:
file.write(image)
Not sure if this is what you’re looking for, or if there’s a "better" way, but this is what I added to the top of my script after the libraries, to make my script compatible with Python 2/3.
# Python version compatibility
if version.major == 3:
from urllib.error import HTTPError
from urllib.request import urlopen, urlretrieve
elif version.major == 2:
from urllib2 import HTTPError, urlopen
def urlretrieve(url, data):
url_data = urlopen(url)
with open(data, "wb") as local_file:
local_file.write(url_data.read())
else:
raise ValueError('No valid Python interpreter found.')
It at least seems like a handy trick, and I hope this might help someone.
Best!