本文已参与「新人创作礼」活动, 一起开启掘金创作之路。
今天又是摸索Python完成工作的一天。
JSON数据单引号和双引号的问题
如果你有一个对象{"str_key": 123},直接使用str()函数转出来的可能是{'str_key': '123'},或者在使用requests的请求时,在data参数上直接传递该对象也有可能出现单引号的情况。
所以我们需要正确处理JSON结构,可以使用标准的json库:
str = json.dumps({"str_key": 123})
在使用requests库发送请求时,如果我们的Content-Type: Application/json,可以使用指定json=xxx字段,也可以使用上面json.dump()处理过后的数据放在data=xxx参数中,这样就可以避免传递JSON的过程中出现单引号的情况
如何处理图片URL,转换成base64的方式
一般网上的教程中,都是教你
- 使用
open()函数打开图片文件 - 用打开文件的
read()方法,获取文件内容 - 将获取到的内容,使用
base64.b64encode()方法转换成base64的数据
这种方式仅限于本地文件,如果是想用URL获取,还需要保存一份文件。
使用URL获取的图片直接转成base64
网上有一种使用urllib2和cStringIO库的方式,我觉得也比较麻烦,但是扩展功能比较多,支持图片裁剪,粘一下代码过来:
import urllib2
import cStringIO
from PIL import Image
import base64
def get_img_base64_from_url(url, max_length=800):
"""
从互联网获取图片,并限定宽度最大为max_width,最后转换为base64
url:互联网上的图片url
max_length:图片缩放的最大宽度。大于该长度的图片将会被缩放。
"""
try:
origin_file = cStringIO.StringIO(urllib2.urlopen(url).read())
img = Image.open(origin_file)
w, h = img.size
larger_side = max(w, h)
if larger_side > max_length:
img = img.resize((int(float(max_length) * w / larger_side),
int(float(max_length) * h / larger_side)), Image.ANTIALIAS)
jpeg_image_buffer = cStringIO.StringIO()
img.save(jpeg_image_buffer, format="JPEG")
base64_str = base64.b64encode(jpeg_image_buffer.getvalue())
return base64_str
except Exception, e:
return ""
其实,只使用requests库的response的content结果即可:
import requests
import base64
url=''
response = requests.get(url, allow_redirects=False)
base64_bytes = base64.b64encode(response.content)
str = str(base64_bytes,'utf-8')
src ='data:image/png;base64,' + str
print(src)
这里面有一个点,如果想做字符串拼接base64,要先转一下字符串,可以用str()方法,也可以用bytes.decode()方法做转换。