如何将互联网上的图像保存到 Python 中的本地文件
Posted
技术标签:
【中文标题】如何将互联网上的图像保存到 Python 中的本地文件【英文标题】:How to save an image on the internet to local file in Python 【发布时间】:2017-07-26 09:19:33 【问题描述】:我想从 reddit 和 imgur 获取直接图片链接,将它们保存到文件中,然后将它们上传到 twitter。我这样做没有真正的原因,我只是想要练习,因为我是编程新手。我不确定如何将图像链接保存到文件中。我遇到了一个 *** 问题,它问了同样的问题,而那个人给出的答案是使用 urllib.retrieve
。
这是我正在使用的代码:
def post_to_twitter():
if 'i.redd.it/' in submission.url or 'i.imgur.com/' in submission.url:
print(submission.url)
urllib.urlretrieve(str(submission.url),'<my directory>')
elif 'i.redd.it/' not in submission.url or 'i.imgur.com/' not in submission.url:
print('No direct imgur or reddit image link')
但是,当我运行此代码时,我收到了一个以前从未遇到过的 unicode 错误 - (unicode error) 'unicodeescape' codec can't decode bytes in position 2-3: truncated \UXXXXXXXX escape
,然后 IDLE 突出显示了我在提交 URL 和我选择的目录之间使用的逗号。
显然这是错误的代码,我确信使用图像链接保存到文件并不像使用单行代码那么容易。我做错了什么,还是有更好的方法来做到这一点?如果可能的话,请你解释一下,就像我五岁一样。我是编程新手,还不懂一些让我感到困惑的词。
我找到了解决方案。
我实际上设法使用我使用的原始代码来实现这个,但稍作调整。
我用过:
urllib.request.urlretrieve(submission.url, 'Reddit To Twitter Downloaded Images\\'+submission.id+'.jpeg')
submission.url
返回图片的链接,所以你可以用任何你想要的替换它,只要它等于直接的图片链接作为字符串,例如my_url = "http://i.imgur.com/qjMiF2A.gif"
'Reddit To Twitter Downloaded Images\\'+submission.id+'.jpeg'
是您要保存的图像的名称。您还可以在其中指定路径。但是,因为我不能手动指定我希望文件保存为什么,所以我使用 submit.id 作为文件名,这样我可以保证它始终是唯一的。然后我只需在其末尾添加.jpeg
以指定文件类型。
【问题讨论】:
Imgur 无法正常工作,他们正在使用 react 除非它确实有效。我编辑了我的原始问题以包含解决方案,并自己发布了一个答案。 【参考方案1】:试试这个:
import os
import urllib.request
import urllib.error
def saveImg(url,path,name):
#url is imgurl
#path is your folder
#name is like tmp.png
if not os.path.exists(path):
os.mkdir(path)
try:
response=urllib.request.urlopen(url);
except urllib.error.URLError as e:
return 0
except urllib.error.HTTPError as e:
return 0
code=response.read()
filehandle=open(path+name,'wb');
filehandle.write(code)
filehandle.close()
return 1
【讨论】:
没关系,我实际上设法用我原来帖子中的那一行代码来做到这一点,但我对其进行了一些修改以使其工作。如果您想看看我是如何做到的,我发布了解决方案作为答案。【参考方案2】:你需要先点 PIL
和 Requests
最干净的方法是
from PIL import Image
import requests
from io import BytesIO
r=requests.get(name)
image=Image.open(BytesIO(r.content))
image.save('0.jpg'.format("Image"))
【讨论】:
当我尝试pip install PIL
时,我收到了这条消息 - i.imgur.com/6LuFFlk.png
没关系,我实际上设法用我原来帖子中的那一行代码来做到这一点,但我对其进行了一些修改以使其工作。如果您想看看我是如何做到的,我发布了解决方案作为答案。【参考方案3】:
我实际上设法使用我使用的原始代码来实现这个,但稍作调整。
我用过:
urllib.request.urlretrieve(submission.url, 'Reddit To Twitter Downloaded Images\\'+submission.id+'.jpeg')
submission.url
返回图像的链接,因此您可以将其替换为您想要的任何内容,只要它等于作为字符串的直接图像链接即可。
'Reddit To Twitter Downloaded Images\\'+submission.id+'.jpeg'
是您要保存的图像的名称。您还可以在其中指定路径。但是,因为我不能手动指定我希望文件保存为什么,所以我使用 submit.id 作为文件名,这样我可以保证它始终是唯一的。然后我只需在其末尾添加.jpeg
以指定文件类型。
【讨论】:
以上是关于如何将互联网上的图像保存到 Python 中的本地文件的主要内容,如果未能解决你的问题,请参考以下文章