2

我正在从具有 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]

我收到一条错误消息,指出 decode 不是 int 类型的成员。这是有道理的,因为有整数值进来。但也有字符串。在我读过的其他此类帖子中,答案总是立即而响亮的'你应该总是知道什么类型会过来'。在很多方面我都会这样做,因为它是一个静态查询,但是为 i 定义一组值似乎非常笨拙,而且老实说难以维护,我想在其中为我编写的每个查询进行转换。在这里,类型测试似乎是干净、可封装和可重用的答案,不是吗?

有什么建议么?

4

2 回答 2

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自动之外的类型。

于 2012-06-17T09:36:57.590 回答
2

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

于 2012-06-17T08:50:50.463 回答