1

您是否知道如何摆脱 Python 列表中字符串前面的字节标识符,也许有一些可以修改的全局设置?

我从 Postgres 9.3 中检索一个查询,并创建一个该查询的列表表单。看起来 Python 3.3 将列中的记录解释char(4)为就像它们是字节字符串一样,例如:

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

所以含义是:

Funds[1][1]=='FND3'
False

我对该数据库有一些控制权,因此我可以将列类型更改为varchar(4),并且效果很好:

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

但这只是一个临时解决方案。在过去的两天里,小 b 让我的生活变成了一场噩梦;),我将感谢您在这个问题上的帮助。

感谢和问候彼得

4

2 回答 2

2

您必须手动实现__str__/ __repr__,或者,如果您愿意冒险,请对字符串执行某种正则表达式替换。

示例__repr__

def stringify(lst):
    return "[{}]".format(", ".join(repr(x)[1:] if isinstance(x, bytes) else repr(x) for x in lst))
于 2013-09-26T01:06:21.267 回答
1

b不是字符串的一部分,就像它周围的引号一样;当您打印字符串时,它们只是表示的一部分。所以,你在追求错误的问题,一个不存在的问题。

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

例如,该字符串'é'b'\xe9'Latin-1 中的字节串相同,也与b'\xce\xa9'UTF-8 中的字节串相同。当然和Latin-1b'\xce\a9'中的字符串是一样的。'é'

因此,您必须明确说明您使用的是什么编码:

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

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

于 2013-09-26T01:17:51.627 回答