Redis 基础教程

Redis 命令

Redis 高级教程

Redis 笔记

original icon
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://www.knowledgedict.com/tutorial/redis-python-result-b-prefix.html

python 使用 redis 读取数据前缀带有 b' 的原因及去掉解决方法

Python 使用 Redis Python 使用 Redis


在 python3 中,使用 redis 模块包读取 redis 的数据时,发现数据打印时前缀都是带有 b' 开头,不知是什么原因,以及去掉它的方式有哪些?

原因

看 redis 的构造函数会有 decode_responses 参数,它表示返回数据是否解码,默认是 False,redis 服务本身对数据进行 bytes 级别的编码。

def __init__(self, host='localhost', port=6379,
                 db=0, password=None, socket_timeout=None,
                 socket_connect_timeout=None,
                 socket_keepalive=None, socket_keepalive_options=None,
                 connection_pool=None, unix_socket_path=None,
                 encoding='utf-8', encoding_errors='strict',
                 charset=None, errors=None,
                 decode_responses=False, retry_on_timeout=False,
                 ssl=False, ssl_keyfile=None, ssl_certfile=None,
                 ssl_cert_reqs='required', ssl_ca_certs=None,
                 ssl_check_hostname=False,
                 max_connections=None, single_connection_client=False,
                 health_check_interval=0, client_name=None, username=None):

解决方法

去掉前缀 b' 有大概三种方式,下面一一介绍各个方法。

构造函数 decode_responses=True

如上原因所述,将构造函数的 decode_responses 设置为 True 即可,所有的返回数据都进行解码。

import redis

redis_conn = redis.Redis(
    host='xxxxx.xxxx.xxx',
    port=6379,
    password='xxxxx',
    decode_responses=True,
)

print(redis_conn.get('knowledgedict'))

返回值调用 decode 函数

如果返回值存在则调用 decode() 函数即可,示例如下:

import redis

redis_conn = redis.Redis(
    host='xxxxx.xxxx.xxx',
    port=6379,
    password='xxxxx',
)

val = redis_conn.get('knowledgedict')
if val:
    print(val.decode())

需要注意的是,如果指定的 key 无数据,则返回 None,所以需要先判断值是否不是 None 后,再调用 decode() 函数。

返回值借助 str 内置类的函数

类似 decode 的方式,利用 str 内置类的构造函数指定解码,具体如下:

import redis

redis_conn = redis.Redis(
    host='xxxxx.xxxx.xxx',
    port=6379,
    password='xxxxx',
)

val = redis_conn.get('knowledgedict')
if val:
    print(str(val, encoding='utf-8'))