我正在努力将带有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定义一组值,我想在其中为我编写的每个查询进行转换。看起来类型测试在这里是干净的,可封装的和可重复使用的答案,不是吗?
有什么建议吗?
答案 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]