在 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'))