对从数据库中选择的值进行测试

时间:2012-06-17 08:43:17

标签: python types character-encoding

我正在努力将带有latin_1字符集的SQL Server数据库中的数据提取到带有utf-8字符集的Greenplum / postgres数据库中。我试图在插入之前立即转换字符串值,但是当我这样做时:

row=[i.decode('latin_1') for i in row]
row=[i.encode('utf-8') for i in row]

我收到一条错误,指出解码不是int类型的成员。这是有意义的,因为有整数值进入。但也有字符串。在我读过的其他这类帖子中,答案总是立即而且响亮地“你应该总是知道会发生什么类型”。在很多方面我都这样做,因为它是一个静态查询,但它似乎非常笨重,而且实际上是不可维护的,为i定义一组值,我想在其中为我编写的每个查询进行转换。看起来类型测试在这里是干净的,可封装的和可重复使用的答案,不是吗?

有什么建议吗?

2 个答案:

答案 0 :(得分:3)

我会使用这样的小函数:

def convert(s):
    try:
        return s.decode('latin-1').encode('utf8')
    except AttributeError:
        return s

然后

row = map(convert, row) # or a compr if you prefer that

优点是它还可以自动处理int以外的类型。

答案 1 :(得分:2)

row = [i.decode('latin_1') if not isinstance(i,int) else i for i in row]