Python中的字节字符串

2024-04-19 18:26:05 发布

您现在位置:Python中文网/ 问答频道 /正文

你知道如何去掉Python列表中字符串前面的字节标识符吗?也许有一些全局设置可以修改?在

我从postgres9.3中检索一个查询,并创建一个查询的列表表单。Python3.3将char(4)类型的列中的记录解释为字节字符串,例如:

Funds[1][1]
b'FND3'
Funds[1][1].__class__
<class 'bytes'>

所以这意味着:

^{pr2}$

我对该数据库有一些控制权,因此可以将列类型更改为varchar(4),它工作得很好:

Funds[1][1]=='FND3'
True

但这只是暂时的解决办法。 在过去的两天里,小b让我的生活变成了一场噩梦;),如果你能帮我解决这个问题,我会很感激的。在

谢谢和问候 彼得


Tags: 字符串数据库表单类型列表字节bytes记录
2条回答

b不是字符串的一部分,与它周围的引号一样;它们只是打印字符串时表示形式的一部分。所以,你找错了问题,一个根本不存在的问题。在

问题是字节字符串b'FND3'与字符串'FND3'不一样。在这个特定的例子中,这可能看起来很愚蠢,但是如果您在任何地方可能有任何非ASCII字符,那么就不再是愚蠢的了。在

例如,字符串'é'与拉丁语1中的字节串b'\xe9'相同,也与UTF-8中的字节串b'\xce\xa9'相同。当然,b'\xce\a9'与拉丁语1中的字符串'é'是相同的。在

所以,你必须明确你使用的是什么编码:

Funds[1][1].decode('utf-8')=='FND3'

但是为什么PostgreSQL会返回字节字符串呢?好吧,这就是char列。由Python绑定决定如何处理它们。如果不知道您使用的是多个PostgreSQL绑定中的哪个,以及哪个版本,就不可能告诉您该怎么做。但是,例如,在recent-ish psycopg中,您只需在连接中设置一个encoding(例如,conn.set_client_encoding('UTF-8');在旧版本中,您必须注册一个标准的类型转换程序并执行其他操作;等等;在py postgresql中,您必须注册lambda s: s.decode('utf-8');等等

您必须手动实现__str__/__repr__,或者,如果您愿意冒这个风险,对字符串执行某种Regex替换。在

示例__repr__

def stringify(lst):
    return "[{}]".format(", ".join(repr(x)[1:] if isinstance(x, bytes) else repr(x) for x in lst))

相关问题 更多 >