Python3踏坑记

227 阅读2分钟

本文已参与「新人创作礼」活动, 一起开启掘金创作之路。

今天又是摸索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的方式

一般网上的教程中,都是教你

  1. 使用open()函数打开图片文件
  2. 用打开文件的read()方法,获取文件内容
  3. 将获取到的内容,使用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()方法做转换。